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
。还有很多其他的。