为什么(foobar>> x)优先于(!foobar.eof())

时间:2013-01-15 03:39:38

标签: c++ text-files binaryfiles

  

可能重复:
  Why is iostream::eof inside a loop condition considered wrong?
  eof() bad practice?

我的老师说我们不应该使用EOF来读取文本文件或二进制文件信息,而应该使用(afile>> x)。他没有解释原因,有人可以向我解释。有人也可以解释这两种不同阅读方法的区别

//Assuming declaration 
//ifstream foobar



( ! foobar.eof() )
{
    foobar>>x; // This is discouraged by my teacher

}


 while (foobar>>x)
{
  //This is encouraged by my teacher

}

1 个答案:

答案 0 :(得分:13)

因为在您尝试从中读取文件之前文件不在最后。

operator>>在尝试读取之后返回对状态的流的引用,并且成功或失败,并且流评估为true如果它成功或false如果失败了。首先测试eof()意味着该文件中没有有用的数据,但是还没有EOF,然后当你读取它时,它处于EOF并且读取失败。

另一个重要细节是,流operator>>会跳过所有前导空格,而不是尾随空格。这就是为什么文件在读取之前不能处于EOF并且在读取之后处于EOF的原因。

此外,前者在文件中的下一个数据是无法读入整数的数据(例如,下一个数据为x)时起作用,而不仅仅是在EOF时,这非常重要

示例:

考虑代码:

int x, y;

f >> x;

if (!f.eof())
    f >> y;

假设f是包含数据123␣的文件(␣表示空格),第一次读取将成功,但之后文件中没有更多整数,它是不是在EOF。第二次读取将失败并且文件将处于EOF,但您不知道,因为您在尝试阅读之前测试了EOF。然后您的代码继续导致未定义的行为,因为y未初始化。