为什么设置failbit。文件似乎打印好了

时间:2014-08-30 01:18:39

标签: c++

我有一段代码可以完成它打算做的工作,但我对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设置。

1 个答案:

答案 0 :(得分:1)

27.5.5.4,第7段:

  

bool eof()const;   返回:如果在rdstate()中设置了eofbit,则返回true。

换句话说,eof()所做的就是检查eofbit是否已经设置。它不会“主动”检查是否已到达文件末尾。

跳过一堆干燥,正式的规范,发生的事情是在get()中检测到文件结束条件。首先设置eofbit,然后设置failbit(get()操作失败)。由于您启用了异常,因此设置failbit的操作会引发异常。如果未启用异常,则get()将返回traits :: eof(),通常为-1,而不是从文件中读取的字符。

外卖:

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