可能重复:
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
}
答案 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
未初始化。