我有一个存储在文本文件中的n 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( ));
}
当nb_try == n时,第一个断言失败,即fin.fail()为真,当它试图读取不存在的第一个数字时发生。但是,读完最后一个数字后,fin.eof()怎么回事?这是否意味着只有在读取存在的第一个数字时它才变为真?同样,fin.fail()和fin.eof()同时变为真是真的吗?
谢谢和问候!
答案 0 :(得分:13)
这是读取文件的错误方法:
while (!fin.eof( ))
{
// readLine;
// Do Stuff
}
标准模式是:
while(getlineOrValues)
{
// Do Stuff
}
因此,快速查看您的代码,我认为将其编写为:
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++;
}
问题是EOF只是真的 AFTER 你试着读过它。在文件中没有留下要读取的字符与EOF为真是不一样的。因此,您阅读最后一行并获取值,并且没有任何内容可供阅读,但EOF仍为假,因此代码重新进入循环。当它尝试并读取c_tmp时,EOF会被触发,你的断言会变成梨状。
解决方案是将read作为while条件。执行读取的结果是流。但是当在布尔上下文中使用流(例如while条件)时,它将被转换为可以像bool一样使用的类型(从技术上讲,它是一个void *但这并不重要)。
答案 1 :(得分:4)
IIRC,在您实际尝试读取文件末尾之前,eofbit不会被设置。也就是说,一旦到达文件末尾,就必须再次读取该标志。
答案 2 :(得分:0)
如果文本文件包含此序列,不带引号“12345 67890”,则#3将返回false,但#4将返回true,因为在最后一个数字后面没有空格:
int i;
bool b;
fin >> i;
b = fin.fail(); // 1
b = fin.eof(); // 2
fin >> i;
b = fin.fail(); // 3
b = fin.eof(); // 4
fin >> i;
b = fin.fail(); // 5
b = fin.eof(); // 6
但是,如果序列是“12345 6789”(注意最后一个数字后的空格),则#3和#4都将返回false,但#5和#6将返回true。
你应该同时检查eof()和fail(),如果两者都是真的,你就没有更多的数据了。如果fail()为true,但eof()为false,则文件存在问题。