可能重复:
为什么iostream中循环条件中:: EOF算错了?
EOF()不好的做法?
我的老师说,我们不应该使用EOF阅读文本文件或二进制文件的信息,而不是我们应该使用(å文件>> X)。 他没有解释为什么,可有人向我解释。 可也有人解释一下在这两年不同的阅读方法的差异
//Assuming declaration
//ifstream foobar
( ! foobar.eof() )
{
foobar>>x; // This is discouraged by my teacher
}
while (foobar>>x)
{
//This is encouraged by my teacher
}
由于该文件是不是在年底前尝试从中读取数据。
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
是未初始化。