我知道,有数百个关于 fail 和 eof 的问题,但没有人能够回答我的问题。 在本例中,只会设置 eof 位:
while (!Ifstream.eof()){
Ifstream >> Buffer;
cout << Buffer << endl;
}
但是在这个例子中,eof 位和 fail 位都会被设置:
while (!Ifstream.fail()){
Ifstream >> Buffer;
cout << Buffer << endl;
}
造成这两种差异的原因是什么? .我只考虑流到达文件末尾的情况。
最佳答案
区别很小。
第一段代码,只要没有达到 EOF 条件就尝试读取。然后它坏了。但是,如果由于某种原因发生错误(即无法通过 <<
运算符转换数据),这段代码将无限循环,因为错误将设置为 FAIL,读取将停止,并且永远不会命中 EOF。
第二段代码使用了一个小技巧。它会尽可能长时间地读取,并在发生错误时停止。好的,合乎逻辑的。但是,当遇到文件结尾时,但 IIRC 还不会设置 EOF 条件。因此,循环将再次运行,尝试在 EOF 状态下读取,这将上升 FAIL 标志并中断循环。但这也意味着你将得到一个处理( cout<
正确的做法是立即检查READING是否成功:
while (true){
if(!(Ifstream >> Buffer))
break;
cout << Buffer << endl;
}
只有这样才能保证循环会在读取失败时立即停止,无论是 EOF 还是 FAIL 或其他原因。
正如 MatsPetersson 和 πìντα ῥεῖ 所建议的那样,上面的代码片段可能会被“压缩”成以下形式:
while (Ifstream >> Buffer)
cout << Buffer << endl;
这是通常的写法。没有 fail/good/eof
需要检查。从 operator>>
返回的值是流本身(就像在 operator<<
中一样)并且流可以测试“真实性”,所以就这么简单。在谈论 fail/good/eof 差异时,我喜欢写更长的形式来强调..你根本不应该在 while-condition 中使用 fail/good/eof,你应该检查流的状态只有在实际尝试读取它之后。 while(true)
非常清楚地说明了这一点。
关于c++ - eof 和 fail 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27876299/