在c中,我正在try 读/写一个带有fread/fwrite()的文件.

根据this的答案,我可以使用ferror()feof()来判断错误.

我的问题是,我该如何利用它们来做到这一点呢?

推荐答案

@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);
  1. 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.

  2. fread()/fwrite()调用之前,stream具有2个内部标志:end-of-fileerror指示符、零、它们中的一个或两者都可以被设置,并且反映在feof()ferror()中.通常,在拨打fread()/fwrite()之前,这两点都很清楚,但并不总是如此.

  3. 有时希望读取/写入的数据量少于请求的数据量.

把这些加在一起就是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,然后设置错误指示器.

C++相关问答推荐

如何创建由符号组成的垂直结果图形?

如何在IF语句中正确使用0.0

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

如何在C中通过套接字自定义数据类型读取原始变量?

C中的指针增量和减量(*--*++p)

如何使用[BTStack]BLE发送大型(>;2kb)信息包

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

OSDev--双缓冲重启系统

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

GetText不适用于包含国际字符的帐户名称

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

如何在C宏定义中包含双引号?

C语言中的指针和多维数组

为什么<到达*时不会转换为>?

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

为什么实现文件中的自由函数默认没有内部链接?

将帧从相机 (/dev/video0) 复制到帧缓冲区 (/dev/fb0) 会产生意外结果

C代码加密文件无法使用openssl解密

C++ 构建系统如何跟踪源文件中的更改?