fread和fwrite有失败吗?怎么处理这个?

时间:2012-02-22 05:43:53

标签: c file stream

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

如手册所示:

  

fread()和fwrite()返回成功读取的项目数或   写入

我必须编写这样的代码吗?

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

}

我们总是要检查fread或fwrite是否成功?

4 个答案:

答案 0 :(得分:13)

不,如果freadfwrite返回的内容少于预期的读取或写入记录数,则执行此类重试循环是没有意义的。也就是说,stdio与低级readwrite操作不同,可能会导致“短”读或写。

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

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

是的。

返回值应始终为 count

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

忽视错误和/或意外情况是不可靠用户不可靠软件的用武之地。

http://www.cplusplus.com/reference/clibrary/cstdio/fread/ < - Junk

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

答案 3 :(得分:0)

如果fread失败,它通常会一直失败。通常是因为它命中了文件的末尾,但可能是出于其他原因。如果失败,通常不会再试一次。