C fputc错误处理?

时间:2011-09-18 15:24:29

标签: c file error-handling

fputc的大多数C文件编写示例使用一个非常基本的示例,几乎没有错误检查过程。

我应该使用哪些错误检查技术和函数与fputc循环一起确保fputc已成功写入文件?我该如何使用它们?

我特别要求fputc的原因是我正在使用双向链接列表。

2 个答案:

答案 0 :(得分:6)

检查fputc的返回值通常不会告诉您任何有用的内容,并会使您的代码变得可怕。返回值很少有意义的原因是因为stdio文件缓冲,并且写入错误(通常是由于耗尽磁盘空间,但也可能是由于硬件故障导致无法处理在刷新缓冲区之前不会报告。因此,即使报告错误,也无法知道成功提交到磁盘的数量。

因此,我的观点是,如果在写入期间发生任何错误时您愿意将整个“保存”操作视为失败,则只应使用stdio来编写文件。如果采用这种方法,则可以完全忽略所有写入函数的返回值。这是因为stdio FILE使内部错误指示符可以ferror(f)访问。因此,只需执行所有写操作而不检查任何错误,然后在关闭文件之前,请检查ferror(f)。如果它返回非零值,则表示您的“保存”操作失败,您可以将此报告给用户并remove部分写入的文件。请记住,您应首先写入临时文件,然后rename将其写入到位,而不是直接在旧文件的顶部写入,除非您希望冒失败时破坏用户旧数据的风险。

答案 1 :(得分:2)

您应该检查int的{​​{1}}返回值。 following is a list

  

成功时,fputc()返回它写入流的值c。上   失败,它返回EOF并将errno设置为以下值之一:

     

EACCES

fputc()
     

EBADF

Another process has the file locked. 
     

EFBIG

stream is not a valid stream opened for writing. 
     

超出偏移最大值。

     

EINTR

The file is a regular file and an attempt was made to write at or
     

EIO

A signal interrupted the call. 
     

ENOMEM

An output error occurred. 
     

ENOSPC

Memory could not be allocated for internal buffers. 
     

ENXIO

An attempt is made to write to a full disk.
     

EPIPE

A device error occurred.