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

joh*_*dav 7 c++ io c++11

我目前正在从 C++ Primer 5th edition 学习 C++。由于看似相互矛盾的信息,我对检查流状态的方法的行为感到困惑。在第 312 页它指出

如果有任何的badbitfailbiteofbit设定,然后一个条件,评估该流将失败。

在下一页,它说s.fail()

如果failbitbadbit在流中设置,则为真

然后

当我们使用流作为条件时执行的代码相当于调用!fail().

这是没有意义的,因为任何表达式使用fail()应该只知道failbitbadbit(因为这些是什么弥补fail()的值),但!fail()等同于所有3badbitfailbit以及eofbit是假的。

这些看似矛盾的陈述是如何结合在一起的?

hob*_*bbs 3

第二个和第三个陈述是正确的并且符合 C++ 标准。那么,第一个根本就是一个错误。既不fail也不operator bool考虑流的状态operator !eofbitgoodeof做。

在通常的事件过程中,尝试读取超过流末尾的内容会同时设置 和eofbitfailbit这可能是这个错误如此容易犯的原因之一。