当我使用fread(C语言)从文件中读取时,fread的返回值有时会为0.
如手册所示:
fread()和fwrite()返回成功读取的项目数或 写入
我必须编写这样的代码吗?
int bytes_read;
while((bytes_read = fread(buffer, sizeof(int), 1, fp)) == 0) {
}
我们总是要检查fread或fwrite是否成功?
答案 0 :(得分:13)
不,如果fread
或fwrite
返回的内容少于预期的读取或写入记录数,则执行此类重试循环是没有意义的。也就是说,stdio与低级read
和write
操作不同,可能会导致“短”读或写。
如果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失败,它通常会一直失败。通常是因为它命中了文件的末尾,但可能是出于其他原因。如果失败,通常不会再试一次。