c++ - eof 和 fail 的区别

标签 c++

我知道,有数百个关于 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/

相关文章:

c++ - 如何在某个类中定义的其他类中使用用户定义的类型?

c++ - 如何使用调用纯虚拟成员的 std::function 初始化抽象类中的成员?

c++ - boost::function 与函数指针

c++ - 结构减去填充的编译时大小

C++:使类及其某些数据成员仅在 namespace 中可用

c++ - 获取 Qt 布局方向以在级联菜单中使用从右到左的功能(例如阿拉伯语)

c++ - 为什么这个循环没有向量化?

c++ - CoreFoundation 打印 Unicode 字符

c++ - Prewitt 滤波器、边缘检测

c++ - 检测 Eigen 对象没有 eval() 成员的编译时解决方案?