簡體   English   中英

為什么要設置故障位。 文件似乎打印正常

[英]Why is the failbit being set. File seems to have printed fine

我有一段代碼可以完成預期的工作,但是我對故障位有疑問。 盡管文件顯示在屏幕上,捕獲塊始終運行。 當到達eof時,為什么要設置故障位? 也許我不了解故障位的正確含義。

    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;
    }

輸出:1 1 0 0異常打開/讀取/關閉文件。 因此很明顯,fail()和eof被設置。

27.5.5.4,第7段:

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

換句話說,eof()所做的只是檢查eofbit是否設置。 它不會“主動”檢查是否已到達文件末尾。

跳過一堆干燥,正式的規范,發生的事情是在get()內部檢測到文件條件的結尾。 首先設置eofbit,然后設置failbit(get()操作失敗)。 因為啟用了異常,所以設置故障位的行為將引發異常。 如果未啟用異常,則get()將返回traits :: eof()(通常為-1),而不是從文件中讀取的字符。

帶走:

  1. 使用異常時,eof()的唯一值是已引發異常之后才能確定異常是否是由於文件條件結束引起的。 在您的示例中,eof()永遠不會返回true。
  2. 當不使用異常時,確實不需要eof(),只需檢查get()是否返回-1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM