5

我正在尝试检查何时fread()引发错误,所以我使用ferror().

chunk = fread(buf, 1, 100, file);
if (ferror(file))
  {
    return errno;
  }

但是,ferror()手册页说:

错误这些函数不应失败,也不要设置外部变量 errno。

那么,我怎么知道在读取文件时发生的错误类型,虽然fread()ferror()没有设置errno

4

2 回答 2

9

你不能从这里到达那里。

fread没有设置errno(正如您所发现的),因此您无法真正确定特定错误状态的多少;只有一个。错误的确切性质通常取决于实现。没有基于 C 标准库的可移植方式来收集它。

对于特定的系统级错误,您可以将其简化为系统调用,可能会遇到诸如糟糕/不存在的 IO 缓冲之类的陷阱。POSIX 可以在某种程度上帮助您。像read, do set之类的电话errno并有一组相当详细的可能结果。如果您使用的平台符合 POSIX 标准,并且代码对于了解情况非常重要,那么这可能是您的一个选择。

但是从 C 标准库中,除了被告知发生了错误之外,您不会发现太多。一般来说,你会发现你不需要更多。

于 2016-10-24T09:39:33.150 回答
3

这些功能不使用errno,所以你也不应该。

值得注意的是,您可以从 的返回值判断一切是否顺利fread()。如果 的返回值fread()与传递的nmemb参数不同(在您的情况下为 100),那么您要么到达文件末尾,要么在读取它时发生错误(source)。所以只在这种情况下测试:

完全放弃 errno 的使用:

chunk = fread(buf, 1, 100, file);
if (chunk != 100) { // If fread() returns a number different to the nmemb parameter, either error or EOF occured
    if (ferror(file))
      {
        printf("Error occured while reading file.");
        return -1; // Or what ever return value you use to indicate an error
      }
}
于 2016-10-24T09:08:15.210 回答