2009-04-24 68 views
3

如果對fread()的調用返回0,並且ferror()指示錯誤(對EOF),那麼可以重試讀取還是關閉並重新打開文件更好?從fread()失敗中恢復的好方法是什麼?

我不能完全重新開始 - 輸入文件已經被部分處理,不能被撤銷(比如說我一次寫出一個塊到一個套接字,並且由於現有的協議,沒有辦法告訴遠端,「沒關係,我需要重新開始」)。我可以fclose()和fopen()文件,fseek()過去已經處理過的數據,並從那裏繼續fread(),但是這些都是必要的嗎?

回答

6

沒有「一刀切」的解決方案,因爲不同的錯誤可能需要不同的處理。來自fread()的錯誤是不尋常的;如果您正確調用它,則錯誤可能表示已使FILE*處於奇怪錯誤狀態的情況。在這種情況下,您最好撥打fclose(),fopen(),fseek()以使事情恢復到良好的狀態。

如果你編碼的東西是怎麼回事,請註明你從ferror()得到實際的錯誤...

+0

如何判斷fread()發生了什麼樣的錯誤?我不認爲errno被設置(至少不符合C標準)。 fread()被正確調用,問題出在底層文件系統上。 – Dan 2009-04-24 17:01:47

+0

ferror()在出錯時返回非零值。使用該結果來檢查特定的錯誤,或者將其轉交給perror()/ strerror來查看你所得到的結果。 – dwc 2009-04-24 17:06:38

6

,您可以給clearerr功能看看。

+0

好點。如果我想在不關閉/打開文件的情況下重試fread(),則需要先清除()。 – Dan 2009-04-24 17:04:24

+0

FWIW,如果你想在錯誤發生後讀取流,你需要使用clearerr清除錯誤。這種行爲被標準定義爲便攜式的事情。 – dirkgently 2009-04-24 17:10:48

+0

+1,希望我首先想到它;) – dwc 2009-04-24 19:30:18

0

您可以使用perror()strerror()向用戶顯示錯誤,並詢問她是否要重試。

儘管如此,實現並不強制提供這樣的錯誤消息。在致電fread()之前,您應該將errno設置爲0;如果失敗並且errno仍然爲0,則不會有錯誤信息可用。