!std::basic_ios::fail()和std::basic_ios::good()有什么区别? (注:此为提问标题,无需回答)

3
while(true)
{

int a, c;
string b;

file >> a >> b >> c;
if( file.good() )
    f(a, b, c);`
else
    break;
}

这段代码无法读取.txt文件的最后一行。如果我将file.good()更改为!file.fail(),它就会起作用。为什么?


当你有'eof'时,'fail()'和'good()'都会返回false,请参见这里 - grisha
@up 怎样阅读显示 basic_ios 访问器值的表格?我现在可以看到 good() 和 fail() 之间的区别,但不确定在哪些情况下。 - redoranish
2个回答

3

bad() --> 如果读写操作失败,则返回true。例如,当我们尝试对未打开写入权限的文件进行写入操作,或者尝试写入设备已无剩余空间时。

fail() --> 在与bad()相同的情况下返回true,但在出现格式错误的情况下也会返回true。例如,在尝试读取整数时提取字母字符。

good() --> 这是最通用的状态标志:在与调用任何先前函数相同的情况下返回false。请注意,good和bad不是完全相反的(good一次检查更多的状态标志)。

稍后会详细说明。


@TobiasBrandt 哈哈,你说得对,他们应该改一下 :) - user4580220

3

我认为这个问题已经在这里得到了解答。

相关摘录: “所有流状态函数——fail、bad、eof和good——都告诉您流的当前状态,而不是预测未来操作的成功。在所需操作之后检查流本身(相当于倒置的fail检查)”。


1
从这里链接的示例中获取的另一个重要信息是读取输入流的惯用方式!基本上,如果您在读取给定的输入之前始终检查流的状态而不是之后,则更容易避免此类问题。 - cowsock

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