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.