@Steve Summit很好地涵盖了常见情况,代码如下:
if (r > 0)
success;
else if (feof(fp))
handle EOF condition;
else
handle error condition;
但我们可以更深入地挖掘:
size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
fread()/fwrite()
returns 0 in 4 cases:
1.1. An end-of-file just occurred. (fread()
only)
1.2. An end-of-file had occurred prior. (fread()
only)
1.3. A read/write error just occurred (e.g. reading a file opened in write only mode or visa-versa, a read parity error, etc.)
1.4. size
or nmemb
is zero.
在fread()/fwrite()
调用之前,stream
具有2个内部标志:end-of-file和error指示符、零、它们中的一个或两者都可以被设置,并且反映在feof()
和ferror()
中.通常,在拨打fread()/fwrite()
之前,这两点都很清楚,但并不总是如此.
有时希望读取/写入的数据量少于请求的数据量.
把这些加在一起就是fread()/fwrite()
size_t count = fread(ptr, size, nmemb, stream); // or fwrite
if (count == 0) {
if (feof(stream)) {
puts("End-of-file.");
} else if (ferror(stream)) {
puts("Stream error.");
} else {
puts("Request size 0."); // Case not expected if size, nmemb are both > 0.
}
} else if (count < nmemb) {
puts("Less than expected data read/written.");
} else {
puts("Success.");
}
在ferror()
之前判断feof()
是有价值的,因为当错误指示器被设置并且fread()
由于文件结束而返回0时,将报告正确的故障原因.请注意,如果设置了error indicator,则fread()/fwrite()
不返回0.如果检测到错误,它们将返回0,然后设置错误指示器.