我有一段代码可以完成它想要做的工作,但我对failbit有疑问。catch块始终运行,尽管文件显示在屏幕上。当达到eof时,为什么设置故障位?也许我不理解failbit的正确含义。。有什么失败了吗?
int main()
{
ifstream infile;
char c;
infile.exceptions ( ifstream::failbit );
try
{
infile.open("../Dose.c", ios::in);
while (!infile.eof())
{
c=infile.get();
cout << c;
}
infile.close();
}
catch(ifstream::failure e)
{
cout << infile.eof() << " " << infile.fail() << " " << infile.bad() << " " << infile.good() ;
cerr << " Exception opening/reading/closing filen";
}
return 0;
}
OUTPUT:1 1 0 0打开/读取/关闭文件时出现异常。很明显,fail()和eof已设置。
27.5.5.4,第7段:
bool-of()常量;如果在rdstate()中设置了eofbit,则返回:true。
换言之,eof()所做的只是检查eofbit是否已设置。它不会"主动"检查是否已到达文件末尾。
跳过一堆枯燥、正式的规范,结果是在get()中检测到文件结尾条件。首先设置eofbit,然后设置failbit(get()操作失败)。因为您启用了异常,所以设置故障位的行为会引发异常。如果未启用异常,则get()将返回traits::eof(),通常为-1,而不是从文件中读取的字符。
外卖:
- 当使用异常时,eof()的唯一值出现在已经引发异常之后,以确定异常是否是由于文件结尾条件引起的。在您的示例中,eof()永远不会返回true
- 当不使用异常时,实际上并不需要eof(),只需检查get()是否返回-1即可