我只是阅读文件, 我需要检查fclose()的返回状态吗?

22

相关: 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()失败,很可能在读取过程中出现了问题——也许是因为某些东西践踏了文件流结构。在这种情况下,您可能没有读取到所有应该读取的数据,并且基于部分数据生成答案可能会有问题。许多人编写代码来进行检查吗?不,很多人不检查关闭是否成功。但是,这可能是因为正在处理的数据并不重要。 - Jonathan Leffler
1
@Jonathan,如果fread没有返回错误,为什么因为不同的系统调用失败,你就会假设有错误呢?我真的想象不出一个已打开读取文件的文件为什么会关闭失败,但如果它发生了——我不认为你可以假设之前的调用实际上失败了。对我来说这没什么意义。 - littleadv
@littleadv:你是否使用feof(fp)ferror(fp)来检查读取是否失败或到达EOF?我通常不这样做;我认为我并不是少数派。你是对的;如果所有先前的读取都成功,并且你确认在最后一次读取时得到了EOF而不是错误,那么fclose()失败的可能性非常小。它可能发生,但不太可能。我提到了fclose()失败的最有可能的原因,即以某种形式的内存破坏或文件指针的某些错误管理(没有关闭实际打开的文件)。绝对不太可能。 - Jonathan Leffler
2个回答

11

如果它失败了,你能做些什么吗?那么是的。如果你无法做任何事情-那么你可以忽略它。

良好的实践是始终检查错误并至少记录它们,如果没有其他可以做的事情。


1
如果close()失败,您可能会遇到关心的错误。文件不仅是数据,它们还是元数据和资源。如果close()失败,您可能仍然拥有一个文件句柄处于打开状态。您可能仍然固定文件的数据,防止其被文件系统重复使用。您可能仍然拥有网络连接。如果在close()上更新了文件的atime,则文件将具有过时的atime。这些都是您真正应该好奇的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接