2014-01-05 187 views
1

我有一個函數(addShape)根據它獲得的id從文件中讀取整數。它獲取id和流is作爲參數。由於某種原因,在閱讀最後一行後,我得到std::ios_base::failure爲什麼這個文件讀取代碼會產生異常?

while (is >> id) 
    addShape(id, is, false); 

我認爲這是從文件中讀取最安全的方法。

這是我的初始化流:

fstream is; 
int id = 0; 
string filename; 
char answer = NULL; 

// set exceptions 
is.exceptions(fstream::failbit | fstream::badbit); 

try { is.open(filename); } 

catch (ifstream::failure e) 
{ 
    clrscr(); 
    cout << "There was an error opening " << filename << endl; 
    waitForEscape(); 
    is.close(); 

    return; 
} 
+1

你能告訴我們你是如何初始化'is'流和'addShape'的代碼嗎?您可能在流對象上啓用了異常。 – templatetypedef

回答

4

當你創建流,請注意你在異常時failbit設置轉彎:

// set exceptions 
is.exceptions(fstream::failbit | fstream::badbit); 

這意味着,任何時候流操作設置爲failbit,流都會拋出異常。

現在,看一下這個代碼:

while (is >> id) 
    addShape(id, is, false); 

在一些點讀is >> id會失敗,是因爲你跑出來的數據,或者是由於數據格式不正確。當這種情況發生在異常關閉的情況下,通過設置failbit並且is >> id評估爲false,這將失敗,停止循環。但是,如果打開異常,則在此情況下設置爲failbit時,將引發異常。

取決於你想做什麼,你可以

  • 未設置例外failbit,這將導致在發生錯誤時循環停止運行,或
  • 建立一個明確的異常處理程序圍繞while循環。

希望這有助於!

+0

如果文件無法打開,我想要發生異常,是否可以在文件打開後關閉異常? – Quaker

+3

@ Quaker-是的,應該可以通過調用'is.exceptions(0)'來實現。也就是說,如果你只是想拋出一個異常,如果一個操作失敗,你可能會考慮把異常關閉,然後自己手動檢查失敗並在出現錯誤時拋出異常。這似乎是一個更優雅的解決方案。 – templatetypedef

相關問題