2012-02-22 58 views
10

當我使用的fread(C語言)從文件中讀取,的fread的返回值有時會是0做fread和fwrite有失敗?如何處理這個?

作爲手動建議:

的fread()和fwrite()返回的數項目成功閱讀或 書面

我必須寫這樣的代碼嗎?

int bytes_read; 
while((bytes_read = fread(buffer, sizeof(int), 1, fp)) == 0) { 

} 

我們是否一定要檢查fread或fwrite是否成功?

回答

11

不,如果freadfwrite返回的讀取或寫入的記錄數少於預期的數量,那麼執行此類重試循環沒有意義。也就是說,stdio不像可導致「短」讀取或寫入的低級別readwrite操作。

如果fread返回的記錄數少於所請求的數量,則表明您已經發生EOF或嚴重的讀取錯誤。您可以通過檢查feof()ferror()來區分它們。

同樣,如果fwrite返回的請求數少於記錄數,則表示磁盤空間不足或發生嚴重的寫入錯誤。

在任何情況下,由於緩衝stdio使得基本上不可能知道成功寫入了多少,因此如果遇到寫入錯誤,通常需要考慮文件丟失並中止整個操作。

0

是的。

返回值應始終爲計數

如果不是 - 您應該使用ferror()feof()來確定您是否已達到文件末尾和/或遇到錯誤。

忽略錯誤和/或意外情況是不可靠的軟件在不知情的用戶身上發生的事情。

http://www.cplusplus.com/reference/clibrary/cstdio/fread/ < - 垃圾

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

+1

否,當整個操作成功時,返回值是'count',而不是'size * count'。 – 2012-02-22 05:56:16

+0

@R .. - 呃......我不認爲這是正確的。你確定?你有不同意我發佈的文檔? – Steve 2012-02-22 05:57:22

+0

@R .. - 我敢肯定,如果你要求「5」大小的「10」項目的迴應應該是「50」而不是「5」。 – Steve 2012-02-22 05:58:17

4

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

成功完成後,FREAD()應僅當遇到讀取錯誤或文件結束時,才返回小於nitems的成功讀取元素的數量。如果size或nitems是0,fread()應該返回0,並且數組的內容和流的狀態保持不變。否則,如果發生讀取錯誤,則應設置流的錯誤指示符,並且應設置errno來指示錯誤。

http://pubs.opengroup.org/onlinepubs/007904875/functions/fwrite.html

和fwrite()函數將返回成功寫入元件的數量,其可以是比NITEMS更少如果遇到寫入錯誤。如果size或nitems爲0,fwrite()應該返回0,並且流的狀態保持不變。否則,如果發生寫入錯誤,應設置流的錯誤指示符,並設置errno以指示錯誤。必須使用ferror()或feof()函數來區分錯誤條件和文件結束條件。

0

如果fread失敗,它通常會保持失敗。通常是因爲它碰到文件的結尾,但可能出於其他原因。如果失敗,你通常不會再試一次。