2010-02-24 24 views
8

隨着FWRITE返回寫入到文件中成功的元素個數,說:檢查在C FWRITE的成功,PERROR

if (!(fwrite(...))) { 
    fprintf(stderr, "Failure"); 
    //perror(???) I sometimes see code that says perror here and I don't know 
    //exactly what this does. 
} 

這是否檢查成功寫入文件?還有其他事情需要擔心嗎?

謝謝。

回答

11

總之,不完全。 fwrite返回成功寫入的元素數量;您需要根據您打算編寫的元素的數量(即,您在參數中傳遞給fwrite的元素)進行檢查。

你所做的檢查是否已寫入了一些元素。

這是perror的參考。

解釋全局 變量errno的爲一個字符串的值和 打印該字符串到stderr(標準 錯誤輸出流,通常是 畫面),與 str中指定的自定義消息optionaly它前面。 errno是一個整數變量,其值 的值描述了通過調用函數庫 函數產生的最後一個錯誤 。由錯誤產生的錯誤字符串取決於正在開發的 平臺和編譯器。如果 參數str不是空指針,則會打印 str,後跟冒號(:) 和一個空格。然後,無論str是否爲 空指針,都會生成 錯誤描述,並在 之後以換行符('\ n')打印。應該在產生錯誤 之後立即調用perror ,否則可能會在調用其他 函數時覆蓋 函數。

+5

如果您總是使用大小爲len的'1'元素來調用它,則不需要將'fwrite'與元素數進行比較。然後可能的返回值只有0和1,其中0表示任何失敗,1表示成功。 – 2011-02-22 18:56:57

2

您的代碼可能無法正確檢查錯誤。使用

if (fwrite(ptr, size, num, f) != num) { 
    // An error occurred, handle it somehow 
} 
+3

@mctylr:錯了。 'fwrite'完全不能處理'EAGAIN'或'EINTR'。他們將設置流的錯誤指示符,並且沒有辦法恢復寫入而不會丟失或重複數據(由於不知道緩衝區的狀態)。如果您想要使用中斷信號或想要將文件設置爲非阻塞,stdio通常不可用。 – 2011-02-22 18:59:32

0

從FWRITE

FREAD()和fwrite()的Linux手冊頁面返回的項目數成功地讀取或寫入 (即,不是字符數)。如果發生錯誤,或者達到文件結尾,則返回值是短項目數(或 零)。

所以你需要與預期的返回值進行比較。

在您可能需要檢查 errno等於 EAGAINEINTR許多情況下,在這種情況下,你通常要重新寫入請求,而在另一些情況下,你要妥善地處理短寫。

對於fwrite的,在短寫(其中小於整個數據被寫入),您可以檢查FEOF()和/或ferror()函數,看是否流正在恢復和最終文件的-, EOF,例如PIPE是否關閉,或者流的錯誤導入器標誌被設置。

+0

請參閱我對您的其他評論的評論。像你說的重試會導致重複失敗和/或數據損壞。 – 2011-02-22 19:00:53

+1

是的,我做了這件事,並且我排除了我原來的錯誤。在我理解的情況下,安全地調用'clearerr()'後,程序可能試圖調用'fwrite()',再次檢查是否繼續出現錯誤/失敗/ EOF。 – mctylr 2011-02-25 17:28:18

0
STRERROR(3)   FreeBSD Library Functions Manual   STRERROR(3) 

NAME 
    perror, strerror, strerror_r, sys_errlist, sys_nerr — system error mes‐ 
    sages 

LIBRARY 
    Standard C Library (libc, -lc) 

SYNOPSIS 
    #include <stdio.h> 

    void 
    perror(const char *string); 

    ... 

DESCRIPTION 
    ... 

    The perror() function finds the error message corresponding to the cur‐ 
    rent value of the global variable errno (intro(2)) and writes it, fol‐ 
    lowed by a newline, to the standard error file descriptor. If the argu‐ 
    ment string is non‐NULL and does not point to the null character, this 
    string is prepended to the message string and separated from it by a 
    colon and space (「: 」); otherwise, only the error message string is 
    printed. 

... 

STANDARDS 
    The perror() and strerror() functions conform to ISO/IEC 9899:1999 
    (「ISO C99」). ...