2011-06-10 47 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()上更新,则该文件将具有陈旧的时间。这些是你真正应该好奇的。

相关问题