stdio总是设置errno吗?
当stdio
流遇到错误(但不是EOF)时,将设置流的错误指示符,以便ferror()
将返回非零值。 我一直认为在errno
可以获得更多信息。 但我怎么知道这个?
某些函数的文档[例如Linux下的man fopen
]表示也将设置errno
。 然而, man fgets
根本没有提到errno
。 glibc信息页面令人放心:
除了设置与流关联的错误指示符之外,对流进行操作的函数还以与对文件描述符进行操作的相应低级函数相同的方式设置“errno”。
但我不知道这种保证有多强。 它是否需要C标准? Visual C / C ++会发生什么?
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 ++流确实有更标准化的error handling。
根据C11标准,第7.21章(“stdio.h”),只有fgetpos
, fsetpos
和ftell
在发生错误时写入errno
。