我有一个X 2矩阵存储在文本文件中.我尝试用C++阅读它
nb_try=0;
fin>>c_tmp>>gamma_tmp;
while (!fin.eof( )) //if not at end of file, continue reading numbers
{
// store
cs_bit.push_back(c_tmp);
gammas_bit.push_back(gamma_tmp);
nb_try++;
// read
fin>>c_tmp;
assert(!fin.fail( )); // fail at the nb_try=n
if(fin.eof( ))break;
fin>>gamma_tmp; // get first number from the file (priming the input statement)
assert(!fin.fail( ));
}
Run Code Online (Sandbox Code Playgroud)
当nb_try == n时,第一个断言错误,即fin.fail()为true,当它尝试读取不存在的第一个数字时发生.但是,读完最后一个数字后,fin.eof()怎么回事?这是否意味着只有在读取存在的第一个数字时它才变为真?fin.fail()和fin.eof()同时变为true也是如此吗?
感谢致敬!
Mar*_*ork 13
这是读取文件的错误方法:
while (!fin.eof( ))
{
// readLine;
// Do Stuff
}
Run Code Online (Sandbox Code Playgroud)
标准模式是:
while(getlineOrValues)
{
// Do Stuff
}
Run Code Online (Sandbox Code Playgroud)
因此,快速查看您的代码,我认为将其编写为更为简单:
while(fin>>c_tmp>>gamma_tmp)
{
// loop only eneterd if both c_tmp AND gamma_tmp
// can be retrieved from the file.
cs_bit.push_back(c_tmp);
gammas_bit.push_back(gamma_tmp);
nb_try++;
}
Run Code Online (Sandbox Code Playgroud)
问题是EOF只有在您尝试阅读之后才会成立.在文件中没有留下要读取的字符与EOF为真是不一样的.因此,您阅读最后一行并获取值,并且没有任何内容可供阅读,但EOF仍为假,因此代码重新进入循环.当它尝试并读取c_tmp时,EOF会被触发,你的断言会变成梨状.
解决方案是将读取作为while条件.执行读取的结果是流.但是当在布尔上下文中使用流(例如while条件)时,它将被转换为可以像bool一样使用的类型(从技术上讲,它是一个void*但这并不重要).