一些功能的文档[例如在Linux下的man fopen]说,errno也将被设置.然而,人类fgets根本没有提到errno. glibc信息页面令人放心:
In addition to setting the error indicator associated with the
stream,the functions that operate on streams also set `errno’ in the
same way as the corresponding low-level functions that operate on file
descriptors.
但我不知道这个保证是多么强大. C标准是否需要?在Visual C/C++中会发生什么?
解决方法
7.13.10.3 The ferror function The ferror function tests the error indicator for the stream pointed to by stream. The ferror function returns nonzero if and only if the error indicator is set for stream.
从C99草案:http://www.vmunix.com/~gabor/c/draft.html.任何实际的错误代码,大部分是实现定义.
但是,linux上的GNU C库也符合POSIX规范:
http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm
在这种情况下,这些定义更加明确.例如,如果您查看fopen的页面:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html
同样,在几乎所有正常的linux系统上使用的GNU C库都符合POSIX标准,因此您可以依赖该信息;).那些(在线)POSIX手册页也通常比标准linux系统手册页更详细(同时阅读两者).
WRT在其他(非POSIX)平台上进行文件操作,它们将具有自己的实现.不幸的是,这样的东西在标准C中不是透明的便携式的.但是,C流确实有更多的标准化错误处理.