C ++中的文件结束

时间:2009-09-29 19:02:00

标签: c++ eof

我有一个存储在文本文件中的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()同时变为真是真的吗?

谢谢和问候!

3 个答案:

答案 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,则文件存在问题。