stdio总是设置errno吗?

时间:2012-05-20 08:55:31

标签: c++ c error-handling stdio errno

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

某些功能的文档[例如Linux下的man fopen表示errno也将设置。但是man fgets根本没有提到errno。 glibc信息页面让人放心:

  

除了设置与之关联的错误指示器外   流,在流上运行的函数也设置了`errno'   与在文件上操作的相应低级函数相同   描述符。

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

2 个答案:

答案 0 :(得分: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 ++流确实有更标准化的错误处理。

答案 1 :(得分:3)

根据C11标准第7.21章(" stdio.h"),只有fgetposfsetposftell写入errno发生错误。