2011-03-30 84 views
0

如果一個程序試圖使用我的文件讀取類訪問不存在的文件的一部分(即在ios_base :: end之後),應該拋出什麼異常?文件的異常處理

我打算使用std :: out_of_range,但現在我開始認爲std :: runtime_error會更合適。

編輯:

接口工作有點不同比標準fstream類,它是基於各地for循環,而不是while循環。因此,而不是執行以下操作:

while (MyFile.peek() != EOF) 
{ 
    char Character = MyFile.get(); 
    // Do stuff with Character. 
} 

類的用戶可以這樣做:

for (std::streampos Pos = 0; Pos < MyFile.GetCharCount(); Pos++) 
{ 
    char Character = MyFile.GetChar(Pos); 
    // Do stuff with Character. 
} 

回答

1

如果你正在提供一個類似數組的界面(使用operator [],而不是 比get),那麼拋出std::out_of_range是個好主意;在這種情況下,更好的 想法可能是找出您實際可以訪問多少個字節,提供一個size()函數,並將 作爲前提條件。 (當然,要提供像這樣的隨機訪問,你必須要將整個文件讀入內存,不能 在文本文件中隨機尋找任意位置,Unix下的 除外)。

如果您提供的是類似界面的文件,那麼設置錯誤狀態 (如iostream)就是首選解決方案。

如果你不提供,這全是你提供什麼樣的問題,以及用戶對它的期望是什麼,或者應該是什麼。

5

不要拋出異常,不喜歡的標準庫確實並設置「最終的文件「標誌。只有拋出一個異常,如果它真的超級破壞意外的發生了一些事情。

+0

看我的編輯;在這種情況下,EOF標誌沒有意義。 – Maxpm 2011-03-30 17:18:31

+1

@Maxpm:那更像是你有一個'char'數組,是吧?那麼你有一些可能性:只要不允許它,拋出一個異常,就像你最初的建議一樣,在這種情況下'out_of_range'更適合,或者只是返回'EOF'字符。或者甚至可能只是返回數組中的最後一個字符。 – Xeo 2011-03-30 17:22:06

1

他們是如何越過文件末尾的閱讀點?如果他們只是閱讀文件的末尾,然後繼續閱讀,我只需發信號給EOF。如果他們試圖超越檔案的末尾,那麼尋找的嘗試就會失敗,所以他們從來沒有到過試圖從那裏讀取的地步。

然而,我不會模仿正常的iostreams太密切。特別是,當/如果讀數到達文件的末尾,我會而不是設置一個「粘性」位,以防止在文件被清除之前進一步讀取文件。在一個進程中編寫一個文件並在另一個進程中讀取文件是非常合理和正常的,因此到達文件結尾可能是一個臨時條件。

+0

該接口具有類似於'GetChar()'和'GetLine()'的函數,它們以'std :: streampos'參數的形式進行定位。我還包含'GetCharCount()'和'GetLineCount()'函數,因此可以很容易地在'for'循環中讀取文件,而不是'while'循環。 (即用'CurrentPos Maxpm 2011-03-30 17:11:14

+1

@Maxpm:聽起來好像你讓它們幾乎像隨機訪問集合一樣處理文件。在這種情況下,我認爲'out_of_range'可能是更有意義/合適的選擇。 – 2011-03-30 17:18:12