fputc的大多数C文件编写示例使用一个非常基本的示例,几乎没有错误检查过程。
我应该使用哪些错误检查技术和函数与fputc循环一起确保fputc已成功写入文件?我该如何使用它们?
我特别要求fputc的原因是我正在使用双向链接列表。
答案 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.