当硬盘100%满时,fwrite(比如说1000字节)返回0 [失败,如预期的那样]但是当硬盘空闲空间少了600Bytes时,则fwrite(1000字节)不返回0 [fail]但返回说300字节,再次调用fwrite仍然返回300字节,fwrite永远不会失败,即使我们调用100次?
错误号设置正确为28.我的问题是为什么fwrite的行为?这是正确的吗?如果fwrite返回少于我们要写的字节,那么这意味着磁盘已满?
是否有建议处理这种情况?
POSIX说这关于fwrite:
如果发生错误,则未指定流的文件位置指示符的结果值 .
这意味着在同一个流上重复相同的 fwrite 是代码中的错误 - 您不知道流的位置,因此尝试写入它根本不是一个好主意 .
fwrite
你似乎已经在处理这个问题:在短暂的 fwrite 之后检查 errno 并做适合你的应用程序的任何事情 .
errno
来自fwrite man page:
成功时,fread()和fwrite()返回读取或写入的项目数 . 此数字等于仅在大小为1时传输的字节数 . 如果发生错误或达到文件末尾,则返回值为短项目计数(或零) .
因此,短写操作是错误的指示,应查阅 errno 以查看写操作未完成的原因 . 在咨询了 errno 之后,Mat的回答解释了(并且C标准基本上说的是相同的东西,除了它使用术语不确定),错误后文件位置无效,因此在失败后尝试继续使用它没有明确定义 .
2 回答
POSIX说这关于fwrite:
这意味着在同一个流上重复相同的
fwrite
是代码中的错误 - 您不知道流的位置,因此尝试写入它根本不是一个好主意 .你似乎已经在处理这个问题:在短暂的
fwrite
之后检查errno
并做适合你的应用程序的任何事情 .来自fwrite man page:
因此,短写操作是错误的指示,应查阅
errno
以查看写操作未完成的原因 . 在咨询了errno
之后,Mat的回答解释了(并且C标准基本上说的是相同的东西,除了它使用术语不确定),错误后文件位置无效,因此在失败后尝试继续使用它没有明确定义 .