2

当硬盘 100% 满时, fwrite(say 1000 Bytes) 返回 0 [Fail , as expected] 但是当硬盘空间很小时说 600Bytes ,然后 fwrite (1000 bytes) 不返回 0 [fail] 但返回说 300字节,再次调用 fwrite 仍然返回 300bytes,fwrite 永远不会失败,即使我们调用 100 次?

错误编号正确设置为 28。我的问题是为什么 fwrite 的行为?这是正确的吗?如果 fwrite 返回的字节数少于我们要写入的字节数,那么这是否意味着磁盘已满?

处理这种情况的建议?

4

2 回答 2

3

fwrite 手册页

成功时,fread()返回fwrite()读取或写入的项目数。此数字等于仅当 size 为 1 时传输的字节数。如果发生错误或到达文件末尾,则返回值是一个短项计数(或零)。

因此,短写入是错误的指示,errno应该咨询以了解写入未完成的原因。咨询后errno,Mat 的回答解释了(和 C 标准说的基本相同,只是它使用了术语indeterminate),文件位置在出错后无效,因此在失败后尝试继续使用它并没有很好的定义。

于 2013-05-12T15:27:28.033 回答
1

POSIX 是这样说的fwrite

如果发生错误,则未指定流的文件位置指示符的结果值。

这意味着fwrite在同一个流上重复相同的操作是您的代码中的错误 - 您不知道流的位置,因此尝试写入它根本不是一个好主意。

你处理这件事就像你已经在做的那样:errno短暂检查fwrite并做任何适合你的应用程序的事情。

于 2013-05-12T14:33:43.607 回答