当stdio
流遇到错误(但不是EOF)时,将设置流的错误指示符,以使ferror()
返回非零值。我一直认为errno
提供了更多信息。但我怎么知道这个?
某些功能的文档[例如Linux下的man fopen
表示errno
也将设置。但是man fgets
根本没有提到errno
。 glibc信息页面让人放心:
除了设置与之关联的错误指示器外 流,在流上运行的函数也设置了`errno' 与在文件上操作的相应低级函数相同 描述符。
但我不知道这种保证有多强。它是否需要C标准? Visual C / C ++会发生什么?
答案 0 :(得分:5)
C标准本身不需要对stdio
函数使用errno WRT;它指定ferror()
,但只说
来自C99草案的7.13.10.3 ferror函数 ferror函数测试stream指向的流的错误指示符。当且仅当为流设置了错误指示符时,ferror函数才返回非零值。
: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 ++流确实有更标准化的错误处理。
答案 1 :(得分:3)
根据C11标准第7.21章(" stdio.h"),只有fgetpos
,fsetpos
和ftell
写入errno
发生错误。