检查fclose()是否失败并返回特定错误

检查fclose()是否失败并返回特定错误,c,gcc,fclose,C,Gcc,Fclose,所以,我试图找到这个问题的答案,但没有成功 我知道该怎么做,以及如何处理这样的情况——事后使用fluss/NULL等。但是检查它对我来说很棘手 因此,基本上: open some file(successfully) - let's call the pointer: file. after some code running... fclose(file); 现在,我如何在关闭文件之后(在它也是一个选项之前)检查它是否真的发生了 情况如何?根据需要,我需要通过打印一些特定错误来处理这种情况。

所以,我试图找到这个问题的答案,但没有成功

我知道该怎么做,以及如何处理这样的情况——事后使用fluss/NULL等。但是检查它对我来说很棘手

因此,基本上:

open some file(successfully) - let's call the pointer: file.
after some code running...
fclose(file);
现在,我如何在关闭文件之后(在它也是一个选项之前)检查它是否真的发生了


情况如何?根据需要,我需要通过打印一些特定错误来处理这种情况。

您可以使用以下代码段:

#include <errno.h> 

if(fclose(file) != 0)
{
    fprintf(stderr, "Error closing file: %s", strerror(errno));
}
#包括
如果(fclose(文件)!=0)
{
fprintf(stderr,“错误关闭文件:%s”,strerror(errno));
}

从手册页中,我们可以看到,使用
fclose()
关闭文件时发生的错误将全局变量
errno
设置为一个值,该值指示发生了什么错误。函数
strerror()
获取
errno
的这个值,并输出一个字符串来帮助指示错误的实际情况。

返回值?检查
fclose
的返回值?:“成功完成后,返回0。否则,返回EOF并设置errno以指示错误”@kaylum那么我需要做什么条件呢?
int r=fclose();如果(!r){/*success*/}或者{/*fail*/}
我不应该再做fclose(file)了,对吗?非常感谢。\@Shay:不,在调用
fclose
之后,无论返回值是什么,您都绝对不能再次使用指针
文件
。这是free/double-free类型错误之后的一个用法,具有非常危险的后果。@R..GitHubSTOPHELPINGICE最后一个问题:)如果在程序中执行fclose(文件),并且fclose()中有错误,程序是否继续?在出错时不检查会发生什么?这取决于你怎么做。
fclose
失败的唯一有意义的方法是存储介质(可能是远程)上发生某种直到关闭时才检测到的错误。由于缓存体系结构的原因,
fclose
报告成功后同样会发生这种错误,除非在
fclose
之前调用
fflush
fsync(fileno(file))
(后者是POSIX非基本C,在底层fd上运行),在这种情况下,您可以确保数据已经安全提交,并且
fclose
“不能失败”(并且它返回的任何错误都可以忽略,因为您已经确认了写入)。因此,如果您不想在应用程序中管理模糊的低级设备/介质故障,那么实际上您甚至不需要检查任何东西。但是如果您真的在意,您可能应该在关闭之前使用
fsync
提交,而不是从
fclose
中查找错误。所有这些都不可能完全可移植,因为有一个健壮的持久存储介质的想法本身并不完全可移植。