C++ 为什么(foobar>;>;x)优于(!foobar.eof())

C++ 为什么(foobar>;>;x)优于(!foobar.eof()),c++,text-files,binaryfiles,C++,Text Files,Binaryfiles,可能重复: 我的老师说我们不应该使用EOF来读取文本文件或二进制文件信息,而应该使用(afile>>x)。他没有解释为什么,有人能给我解释一下吗。有人能解释一下这两种不同的阅读方法有什么不同吗 //Assuming declaration //ifstream foobar ( ! foobar.eof() ) { foobar>>x; // This is discouraged by my teacher } while (foobar>>

可能重复:

我的老师说我们不应该使用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

}

因为在您尝试读取文件之前,该文件不在末尾

操作符>>
返回对处于读取尝试后状态的流的引用,如果读取成功或失败,则流计算为
true
,如果读取失败,则计算为
false
。测试
eof()
首先意味着文件中可能没有有用的数据,但还没有达到eof,然后当您从中读取时,它处于eof,读取失败

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

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

示例:

以代码为例:

int x, y;

f >> x;

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

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

@Computernerd请看我的示例。我喜欢你的解释。它直截了当且易于理解。@SethCarnegie(f>>y)不会因为无法读取空间而导致故障?@Computernerd正如我所说,
操作符>
返回一个
ostream&
,其计算结果为
bool
。如果读取失败,它将计算为
false
,如果读取成功,它将计算为
true
。还有很多其他的。