2014-08-30 47 views
0

我有一段代碼可以完成它打算做的工作,但我對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 file\n"; 
     } 
    return 0; 
    } 

OUTPUT:1 1 0 0異常打開/讀取/關閉文件。所以顯然失敗()和eof被設置。

+0

FWIW,'ios :: in'是不必要的,循環應該是'while(infile.get(c)){cout << c;}','infile.close();'是不必要的, 'return 0;'是不必要的,異常應該被const引用捕獲。 – chris 2014-08-30 01:28:22

+0

是什麼讓你認爲在失敗之前已經達到了eof? [看到這個問題](https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – WhozCraig 2014-08-30 01:30:43

回答

1

27.5.5.4,第7段:

布爾EOF()const的; 返回:如果在rdstate()中設置了eofbit,則爲true。

換句話說,所有的EOF()的作用是檢查是否eofbit是已經集。它不會「主動」檢查文件結尾是否已經到達。

跳過一堆乾燥,形式化的規範,會發生什麼是在get()內檢測到文件結束條件。 eofbit首先被設置,然後failbit(get()操作失敗)。由於您啓用了異常,因此設置故障位的操作會引發異常。如果未啓用異常,則get()將返回traits :: eof(),通常爲-1,而不是從文件讀取的字符。

外賣:

  1. 當使用異常,EOF()唯一的價值來自後的異常被拋出已,以確定異常是否是由於文件終止條件。在你的例子中,eof()永遠不會返回true。
  2. 不使用異常時,不需要eof(),只需檢查get()是否返回-1。
+0

所有我試圖做的是打開文件與嘗試catch塊。那是我的意圖。所以我可以做一些異常處理,因爲文件不存在或打開時會發生一些錯誤。 – Angelo 2014-08-30 06:37:10

+0

您所要做的就是使用is_open()來檢查文件是否成功打開。 – 2014-08-30 12:36:18

相關問題