c-fread和fwrite有故障吗?如何处理



当我使用fread(C语言)从文件中读取时,fread的返回值有时会为0。

如手册建议:

fread()和fwrite()返回成功读取或书面

我必须这样写代码吗?

int bytes_read;
while((bytes_read = fread(buffer, sizeof(int), 1, fp)) == 0) {
}

我们总是要检查fread还是fwrite成功了吗?

不,如果freadfwrite返回的记录数少于预期的读写记录数,那么进行这样的重试循环是没有意义的。也就是说,stdio不像低级别的readwrite操作那样会导致"短"读取或写入。

如果fread返回的记录数少于请求的记录数,则表示您遇到了EOF或严重的读取错误。您可以通过检查feof()ferror()来区分它们。

类似地,如果fwrite返回的记录数少于请求的记录数,则表示磁盘空间不足或出现严重的写入错误。

在任何情况下,由于缓冲stdio,基本上不可能知道成功写入了多少,因此如果遇到写入错误,通常需要考虑文件丢失并中止整个操作。

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

成功完成后,fread()将返回成功读取的元素数,仅当遇到读取错误或文件结尾时,该元素数才小于nitems。如果size或nitems为0,fread()将返回0,并且数组的内容和流的状态保持不变。否则,如果发生读取错误,则应设置流的错误指示器,并设置errno以指示错误。

http://pubs.opengroup.org/onlinepubs/007904875/functions/fwrite.html

fwrite()函数应返回成功写入的元素数量,如果遇到写入错误,该数量可能小于nitem。如果size或nitems为0,fwrite()将返回0,并且流的状态保持不变。否则,如果发生写入错误,则应设置流的错误指示器,并设置errno以指示错误

ferror()或feof()函数必须用于区分错误条件和文件结束条件。

如果fread失败,它通常会继续失败。通常是因为它到达了文件的末尾,但可能是其他原因。如果失败,你通常不会再试一次。

返回值应始终为count

如果不是,则应使用ferror()feof()来确定是否已到达文件末尾和/或遇到错误。

忽视错误和/或意外情况是不可靠软件对毫无戒心的用户造成伤害的原因。

http://www.cplusplus.com/reference/clibrary/cstdio/fread/<--垃圾邮件

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

最新更新