如果對fread()的調用返回0,並且ferror()指示錯誤(對EOF),那麼可以重試讀取還是關閉並重新打開文件更好?從fread()失敗中恢復的好方法是什麼?
我不能完全重新開始 - 輸入文件已經被部分處理,不能被撤銷(比如說我一次寫出一個塊到一個套接字,並且由於現有的協議,沒有辦法告訴遠端,「沒關係,我需要重新開始」)。我可以fclose()和fopen()文件,fseek()過去已經處理過的數據,並從那裏繼續fread(),但是這些都是必要的嗎?
如果對fread()的調用返回0,並且ferror()指示錯誤(對EOF),那麼可以重試讀取還是關閉並重新打開文件更好?從fread()失敗中恢復的好方法是什麼?
我不能完全重新開始 - 輸入文件已經被部分處理,不能被撤銷(比如說我一次寫出一個塊到一個套接字,並且由於現有的協議,沒有辦法告訴遠端,「沒關係,我需要重新開始」)。我可以fclose()和fopen()文件,fseek()過去已經處理過的數據,並從那裏繼續fread(),但是這些都是必要的嗎?
沒有「一刀切」的解決方案,因爲不同的錯誤可能需要不同的處理。來自fread()
的錯誤是不尋常的;如果您正確調用它,則錯誤可能表示已使FILE*
處於奇怪錯誤狀態的情況。在這種情況下,您最好撥打fclose()
,fopen()
,fseek()
以使事情恢復到良好的狀態。
如果你編碼的東西是怎麼回事,請註明你從ferror()
得到實際的錯誤...
,您可以給clearerr
功能看看。
好點。如果我想在不關閉/打開文件的情況下重試fread(),則需要先清除()。 – Dan 2009-04-24 17:04:24
FWIW,如果你想在錯誤發生後讀取流,你需要使用clearerr清除錯誤。這種行爲被標準定義爲便攜式的事情。 – dirkgently 2009-04-24 17:10:48
+1,希望我首先想到它;) – dwc 2009-04-24 19:30:18
您可以使用perror()
或strerror()
向用戶顯示錯誤,並詢問她是否要重試。
儘管如此,實現並不強制提供這樣的錯誤消息。在致電fread()
之前,您應該將errno
設置爲0;如果失敗並且errno
仍然爲0,則不會有錯誤信息可用。
如何判斷fread()發生了什麼樣的錯誤?我不認爲errno被設置(至少不符合C標準)。 fread()被正確調用,問題出在底層文件系統上。 – Dan 2009-04-24 17:01:47
ferror()在出錯時返回非零值。使用該結果來檢查特定的錯誤,或者將其轉交給perror()/ strerror來查看你所得到的結果。 – dwc 2009-04-24 17:06:38