C++ 这两者有什么区别!std::basic_ios::fail()和std::basic_ios::good()?
此代码没有读取最后一行form.txt文件。如果我将C++ 这两者有什么区别!std::basic_ios::fail()和std::basic_ios::good()?,c++,C++,此代码没有读取最后一行form.txt文件。如果我将file.good()更改为!file.fail()它可以工作。为什么? bad()-->如果读取或写入操作失败,则返回true。例如,如果我们试图写入一个无法写入的文件,或者我们试图写入的设备没有剩余空间 fail()-->在与bad()相同的情况下返回true,但在发生格式错误的情况下也返回true,例如在尝试读取整数时提取字母字符 good()-->它是最通用的状态标志:在调用前面的任何函数都会返回true的情况下,它返回false。请注
file.good()
更改为!file.fail()
它可以工作。为什么? bad()-->如果读取或写入操作失败,则返回true。例如,如果我们试图写入一个无法写入的文件,或者我们试图写入的设备没有剩余空间
fail()-->在与bad()相同的情况下返回true,但在发生格式错误的情况下也返回true,例如在尝试读取整数时提取字母字符
good()-->它是最通用的状态标志:在调用前面的任何函数都会返回true的情况下,它返回false。请注意,好与坏并非完全相反(好会同时检查更多的州标志)
我将详细说明后一点。我想这已经包括在内了
相关摘录:
“所有流状态函数–fail、bad、eof和good–告诉您流的当前状态,而不是预测未来操作的成功。在所需操作之后检查流本身(相当于反向失败检查)”当您将有
eof
、fail()
和good()
将同时给出false
这两个值,请参阅@up如何读取显示基本ios访问器值的表?我现在可以看到good()和fail()之间的区别,但不清楚在什么情况下。从这里链接的示例中可以收集到的另一个重要信息是从流中读取输入的惯用方式!基本上,如果您总是在读取给定输入之前检查流的状态,而不是在读取之后检查流的状态,则更容易避免此类问题。@TobiasBrandt LOL,您是对的,他们应该更改它:)
while(true)
{
int a, c;
string b;
file >> a >> b >> c;
if( file.good() )
f(a, b, c);`
else
break;
}