2011-06-10 83 views
19

相關:fclose return value check如果我只讀文件,是否需要檢查fclose()的返回狀態?

雖然重要的是要檢查的fclose()返回值如果你正在寫一個文件(如果刷新操作失敗),是它必須這樣做時閱讀文件?

FILE *f = fopen(path, "r"); 
if (f == NULL) 
    return 0; 

/* Do something with the file... */ 

if (fclose(f) != 0) { 
    /* Error closing a file we successfully read. */ 
    return 0; 
} 
+2

這取決於你應該閱讀的數據的重要性。如果'fclose()'失敗,那麼在閱讀過程中可能會出現問題 - 可能是因爲文件流結構遭到了踐踏。在這種情況下,您可能沒有閱讀所有您應該獲得的數據,並根據部分數據生成答案可能是一個問題。有很多人寫代碼來做這個檢查嗎?沒有;很多人不檢查密切的成功。但是,這可能是因爲正在處理的數據並不重要。 – 2011-06-10 05:32:34

+1

@Jonathan,如果fread沒有返回錯誤,爲什麼你會認爲只是因爲一個不同的系統調用失敗而出現錯誤?我無法想象爲什麼一個打開的文件無法關閉,但是如果發生這種情況 - 我認爲你不能假設之前沒有返回失敗的調用實際上失敗了。對我來說沒有多大意義。 – littleadv 2011-06-10 06:01:27

+0

@littleadv:你使用'feof(fp)'vs'ferror(fp)'檢查了讀取失敗還是到達了EOF?我通常不這樣做;我不認爲我也是少數。你是對的;如果所有先前的讀取都成功了,並且您確認了EOF並且在最終讀取時沒有錯誤,那麼'fclose()'很可能會失敗。它可能發生,但不可能。我提到了'fclose()'失敗的最可能原因,即內存以某種形式或形式踐踏,或者文件指針管理不當(不關閉實際打開的文件)。絕對不可能。 – 2011-06-10 06:15:12

回答

10

如果失敗了,您可以做些什麼嗎?好的。如果沒有什麼可以做的 - 那麼你可以忽略它。

好的做法是總是檢查錯誤並至少記錄它們,如果沒有別的辦法可以做。

0

如果close()失敗,那麼您可能會遇到一個您關心的錯誤。文件不僅僅是數據。它們是元數據,它們是資源。如果close()失敗,則可能仍然打開文件句柄。您可能仍在固定文件的數據,從而阻止它被文件系統重新使用。您可能仍然打開網絡連接。如果文件的atime在close()上更新,則該文件將具有陳舊的時間。這些是你真正應該好奇的。

相關問題