fclose返回值检查

Jay*_*Jay 27 c file-io

是否需要检查fclose的返回值?如果我们已成功打开文件,它可能无法关闭的可能性有多大?

谢谢!

问候,杰伊

Nic*_*lás 36

当你fwrite到一个文件,它可能实际上没有写任何东西,它可能留在缓冲区(在FILE对象内).调用fflush实际上会将其写入磁盘.该操作可能会失败,例如,如果您的磁盘空间不足,或者存在其他I/O错误.

fclose 也隐式刷新缓冲区,因此可能由于同样的原因而失败.


小智 30

来自comp.lang.c:

fclose()调用可能会失败,并且应该像所有其他文件操作一样进行错误检查.听起来很迂腐吧?错误.在以前的生活中,我公司的产品通过在关闭文件时省略检查失败来设法销毁客户的数据.顺序就像(释义):

stream = fopen(tempfile, "w"); 
if (stream == NULL) ... 
    while (more_to_write) 
        if (fwrite(buffer, 1, buflen, stream) != buflen) ... 
fclose (stream); 

/* The new version has been written successfully.  Delete 
 * the old one and rename. 
 */ 
remove (realfile); 
rename (tempfile, realfile); 
Run Code Online (Sandbox Code Playgroud)

当然,发生的事情是fclose()耗尽磁盘空间试图写入最后几个数据块,因此`tempfile'被截断并且无法使用.由于未检测到fclose()故障,程序正在进行中并销毁了现有最佳版本的数据,以支持受损版本.而且,正如墨菲所说的那样,在这一特定事件中受害者是客户部门的负责人,有权购买更多产品或用竞争对手的产品代替的人 - 而且,他是一个人.由于其他原因,我们已经对我们不满意了.

将所有随之而来的苦难归咎于这一遗漏,但值得指出的是,顾客和我以前的公司都已经从企业生态学中消失了.

检查这些故障代码!


Lnx*_*gr3 5

您可以(并且应该)报告错误,但是从某种意义上说,流仍然关闭

调用fclose()之后,对流的任何使用都会导致未定义的行为。