10

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

一些功能的文档[例如man fopen在 Linux 下] 说也errno将被设置。不过man fgets完全没提errno。glibc 信息页面令人放心:

除了设置与流相关的错误指示符之外,对流进行操作的函数也设置 `errno' 的方式与对文件描述符进行操作的相应低级函数相同。

但我不知道这个保证有多强。是C标准要求的吗?在 Visual C/C++ 中会发生什么?

4

2 回答 2

6

C 标准本身并不需要大量使用 errno WRTstdio函数;它指定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

您将在Errors下看到很多详细信息,包括特定的 errno 代码。

同样,几乎所有普通 linux 系统上使用的 GNU C 库都符合 POSIX,因此您可以依靠该信息;)。那些(在线)POSIX 手册页通常也比标准的 linux 系统手册页更详细(同时阅读)。

WRT 到其他(非 POSIX)平台上的文件操作,它们将有自己的实现。不幸的是,这样的东西在标准 C 中并不是透明可移植的。不过,C++ 流确实具有更标准化的错误处理。

于 2012-05-20T09:18:20.910 回答
3

根据 C11 标准,第 7.21 章(“stdio.h”),只有fgetpos,fsetpos并在发生错误时ftell写入。errno

于 2012-05-20T11:04:03.433 回答