我正在尝试检查何时fread()
引发错误,所以我使用ferror()
.
chunk = fread(buf, 1, 100, file);
if (ferror(file))
{
return errno;
}
但是,ferror()
手册页说:
错误这些函数不应失败,也不要设置外部变量 errno。
那么,我怎么知道在读取文件时发生的错误类型,虽然fread()
并ferror()
没有设置errno
?
你不能从这里到达那里。
fread
没有设置errno
(正如您所发现的),因此您无法真正确定特定错误状态的多少;只有一个。错误的确切性质通常取决于实现。没有基于 C 标准库的可移植方式来收集它。
对于特定的系统级错误,您可以将其简化为系统调用,可能会遇到诸如糟糕/不存在的 IO 缓冲之类的陷阱。POSIX 可以在某种程度上帮助您。像read
, do set之类的电话errno
并有一组相当详细的可能结果。如果您使用的平台符合 POSIX 标准,并且代码对于了解情况非常重要,那么这可能是您的一个选择。
但是从 C 标准库中,除了被告知发生了错误之外,您不会发现太多。一般来说,你会发现你不需要更多。
这些功能不使用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
}
}