恐惧和恐惧不要设置errno

Mah*_*rak 3 c errno fread ferror

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

chunk = fread(buf, 1, 100, file);
if (ferror(file))
  {
    return errno;
  }
Run Code Online (Sandbox Code Playgroud)

但是,ferror()手册页说:

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

所以,我怎么能知道,当文件被读取时出现错误类型,但fread()ferror()没有设置errno

Who*_*aig 5

您不能从这里到达那里。

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

对于特定的系统级错误,您可以将其归类为系统调用,可能会遇到一些陷阱,例如整个过程中IO缓冲不佳/不存在。POSIX可以为您提供一些帮助。呼叫喜欢read一套errno,并有相当详细的一系列可能的结果。如果您使用的平台兼容POSIX,并且代码对于了解是至关重要的,那么这可能是您的选择。

但是从C标准库中,除了被告知发生了错误之外,您将发现不了什么。通常,您会发现自己并不需要更多。

  • POSIX要求`fread`在错误时设置`errno`。从POSIX文档中,关于“ fread”,“否则,如果发生读取错误,则应设置流的错误指示符,并且应将“ errno”设置为指示错误。” (2认同)