C++流中的eof()、fail()、bad()和good()有什么区别?

9
我目前正在学习C++ Primer第五版中的C++。由于信息似乎存在冲突,我对检查流状态的方法行为感到困惑。在第312页上,它声明:
如果设置了任何一个badbit、failbit或eofbit,则评估该流的条件将失败。
在接下来的一页上,它说s.fail()是
如果流中的failbit或badbit被设置则为true,并且当我们将流用作条件时执行的代码等效于调用!fail()。
这不合理,因为使用fail()的任何表达式只应知道failbit和badbit(因为它们组成fail()的值),然而!fail()等效于所有三个badbit、failbit和eofbit都为false。
这些看似矛盾的陈述是如何结合起来的?

1
请查看http://en.cppreference.com/w/cpp/io/ios_base/iostate。它提供了关于该主题的出色概述。 - R Sahu
@n.m. http://www.cplusplus.com/reference/ios/ios/operator_bool/ 是正确的。 - hobbs
我为问题添加了引用块格式。请确认我没有搞砸任何东西。 - hyde
@n.m. 没问题 :) - hobbs
@hyde 这个问题看起来不错。感谢您的编辑 :)。 - john01dav
显示剩余5条评论
1个回答

3
第二和第三个语句是正确的,并且符合C++标准。因此,第一个语句只是一个错误。无论是 fail 还是 operator bool 或者 operator ! 都没有考虑流的eofbit状态。只有goodeof 考虑了这种情况。
在通常情况下,试图读取超出流末尾的位置会设置eofbitfailbit。这也是为什么这个错误如此容易发生的原因之一。

如果operator bool没有检查eof,那么为什么在Linux系统上键入ctrl+d时,程序似乎会退出while循环? ctrl+d也会使stdin无效吗? - john01dav
因为当没有更多字符可提取时,它会设置 failbit。请参见 http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2。 - Dustin Nieffenegger
请看我的回答的第二段 - 在 EOF 之后尝试使用 >> 进行读取会导致流失败 以及 EOF,因此布尔检查返回 false。 - hobbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接