为什么设置故障位.文件似乎打印得很好



我有一段代码可以完成它想要做的工作,但我对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,而不是从文件中读取的字符。

外卖:

  1. 当使用异常时,eof()的唯一值出现在已经引发异常之后,以确定异常是否是由于文件结尾条件引起的。在您的示例中,eof()永远不会返回true
  2. 当不使用异常时,实际上并不需要eof(),只需检查get()是否返回-1即可

相关内容

最新更新