stdio总是设置errno吗?

Adr*_*ala 10 c c++ error-handling stdio errno

stdio流遇到错误(但不是EOF)时,将设置流的错误指示符,以便ferror()返回非零值.我一直认为可以获得更多信息errno.但我怎么知道这个?

某些功能的文档[例如man fopen在Linux下]说明errno也将设置.但是man fgets根本没有提到errno.glibc信息页面令人放心:

除了设置与所述流相关联的错误指示符,该上流进行操作的功能也以同样的方式作为上文件描述符操作相应的低级别的功能设置`错误号".

但我不知道这种保证有多强.它是否需要C标准?Visual C/C++会发生什么?

del*_*ver 5

C标准本身不需要对stdio函数使用errno WRT ; 它指出ferror()但仅仅说明了

7.13.10.3 ferror函数 ferror函数测试stream指向的流的错误指示符.当且仅当为流设置了错误指示符时,ferror函数才返回非零值.

来自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++流确实有更标准化的错误处理.