2012-02-22 68 views
10

当我使用的fread(C语言)从文件中读取,的fread的返回值有时会是0做fread和fwrite有失败?如何处理这个?

作为手动建议:

的fread()和fwrite()返回的数项目成功阅读或 书面

我必须写这样的代码吗?

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

} 

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

回答

11

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

如果fread返回的记录数少于所请求的数量,则表明您已经发生EOF或严重的读取错误。您可以通过检查feof()ferror()来区分它们。

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

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

0

是的。

返回值应始终为计数

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

忽略错误和/或意外情况是不可靠的软件在不知情的用户身上发生的事情。

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

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

+1

否,当整个操作成功时,返回值是'count',而不是'size * count'。 – 2012-02-22 05:56:16

+0

@R .. - 呃......我不认为这是正确的。你确定?你有不同意我发布的文档? – Steve 2012-02-22 05:57:22

+0

@R .. - 我敢肯定,如果你要求“5”大小的“10”项目的回应应该是“50”而不是“5”。 – Steve 2012-02-22 05:58:17

4

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()函数来区分错误条件和文件结束条件。

0

如果fread失败,它通常会保持失败。通常是因为它碰到文件的结尾,但可能出于其他原因。如果失败,你通常不会再试一次。