C fputcerror handling?

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

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

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

检查fputc的返回值通常不会告诉你任何有用的东西,并会使你的代码变得可怕。 很少有意义的返回值的原因是因为stdio文件被缓冲 ,并且写入错误(通常是由于耗尽磁盘空间,但也可能是由于硬件故障,实际上没有办法优雅地处理)直到刷新缓冲区。 因此,即使报告错误,也无法知道成功提交到磁盘的数量。

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

您应该检查fputc()int返回值。 以下是一个列表 :

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

EACCES

 Another process has the file locked. 

EBADF

 stream is not a valid stream opened for writing. 

EFBIG

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

超出偏移最大值。

EINTR

 A signal interrupted the call. 

EIO

 An output error occurred. 

ENOMEM

 Memory could not be allocated for internal buffers. 

ENOSPC

 An attempt is made to write to a full disk. 

ENXIO

 A device error occurred. 

EPIPE

 An attempt is made to write to a closed pipe.