为什么(foobar的>> X)优于(!foobar.eof())[复制](Why is

2019-08-06 21:05发布

可能重复:
为什么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

}

Answer 1:

由于该文件是不是在年底前尝试从中读取数据。

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是未初始化。



文章来源: Why is (foobar>>x) preferred over (! foobar.eof() ) [duplicate]