c - fread 和 ferror 不要设置 errno

标签 c fread errno ferror

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

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

但是,ferror() 手册页(man 3 ferror,或者只是 man ferror)说:

ERRORS
These functions should not fail and do not set the external variable errno.

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

最佳答案

你不能从这里到达那里。

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

对于特定的系统级错误,您可以将其转为系统调用,可能会遇到诸如 IO 缓冲不佳/不存在等缺陷。 POSIX 可以在某种程度上拯救你。像read这样的电话, do 设置 errno 并有一组相当详细的可能结果。如果您使用的平台是 POSIX 兼容的,并且代码真的非常重要,需要了解,那么这可能是您的一个选择。

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

关于c - fread 和 ferror 不要设置 errno,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40214464/

相关文章:

c - 在 C 中强制执行强类型检查(typedef 的类型严格性)

c - wedit lcc-win32 中程序 "is not up to date"执行错误

c - 解析以逗号分隔的字符串只能工作一次?

r - 使用 fread 和 awk 子集许多 .dat.gz 文件

c - ERANGE 和 EOVERFLOW 之间的语义区别是什么?

c++ - OpenSSL 配置最大连接数

php - 恐惧超时与 'mod_fcgid: read timeout from pipe'

c - 为什么 fread() 没有获得预期的字节?

Docker 容器退出 : segmentation fault, errno 139,退出状态 139

c - 读取报告 Bad File Descriptor 尽管 getc 成功使用相同的 fd 读取 char