我有一段代码可以完成它打算做的工作,但我对failbit有疑问。尽管文件显示在屏幕上,但始终会运行catch块。当达到eof时为什么设置failbit?也许我不理解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 file\n";
}
return 0;
}
OUTPUT:1 1 0 0异常打开/读取/关闭文件。很明显失败()和eof设置。
答案 0 :(得分:1)
27.5.5.4,第7段:
bool eof()const; 返回:如果在rdstate()中设置了eofbit,则返回true。
换句话说,eof()所做的就是检查eofbit是否已经设置。它不会“主动”检查是否已到达文件末尾。
跳过一堆干燥,正式的规范,发生的事情是在get()中检测到文件结束条件。首先设置eofbit,然后设置failbit(get()操作失败)。由于您启用了异常,因此设置failbit的操作会引发异常。如果未启用异常,则get()将返回traits :: eof(),通常为-1,而不是从文件中读取的字符。
外卖: