Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“getchar()”返回错误的特殊情况有哪些?_C_Posix_Stdio - Fatal编程技术网

“getchar()”返回错误的特殊情况有哪些?

“getchar()”返回错误的特殊情况有哪些?,c,posix,stdio,C,Posix,Stdio,所以我知道getchar()在输入结束或发生错误时返回EOF。我还知道,我可以通过ferror(stdin)和feof(stdin)检查哪些情况发生。 我想知道什么情况下会发生错误,尤其是 我检查了这两个函数的手册页,但没有任何内容。所有stdio.h都指向一个称为错误指示器的东西,这是一个内部变量,假定位于应用程序程序员无法访问的不透明文件对象中(参见C17.21.1) 有关getchar的文档,请参见C17.21.7.6: getchar函数返回由指向的输入流中的下一个字符 斯丁。如果流位于

所以我知道
getchar()
在输入结束或发生错误时返回EOF。我还知道,我可以通过
ferror(stdin)
feof(stdin)
检查哪些情况发生。 我想知道什么情况下会发生错误,尤其是


我检查了这两个函数的手册页,但没有任何内容。

所有stdio.h都指向一个称为错误指示器的东西,这是一个内部变量,假定位于应用程序程序员无法访问的不透明
文件
对象中(参见C17.21.1)

有关
getchar
的文档,请参见C17.21.7.6:

getchar函数返回由指向的输入流中的下一个字符 斯丁。如果流位于文件末尾,则设置流的文件末尾指示符并 getchar返回EOF。如果发生读取错误,则设置流的错误指示器并 getchar返回EOF

因此,我们不知道是
getchar
返回了
EOF
,因为它到达了流的末尾,还是因为存在读取错误。为了知道,我们必须检查错误指示器

这就是
ferror(stdin)
的用武之地。这是一个稍微有用的函数,因为它只执行以下操作(C17 7.21.10.3):

当且仅当错误指示器设置为 小溪

这就是它的全部——这是一个标准化的、可移植的抽象层,我们无法真正知道引擎盖下到底发生了什么。这很好,因为大多数时候我们根本不在乎

在这些标准C函数下面将有一个特定于操作系统的API,在POSIX可能
read()
的情况下,在Windows可能
ReadFile()
的情况下,等等。这些函数反过来可能会失败,原因有很多:文件句柄不正确,文件被另一个进程占用,操作系统给用户的文件没有读取权限,等等

理论上,
getchar
也可以连接到嵌入式系统上的串行总线,在这种情况下,它失败的原因与托管系统上的完全不同。现在我们突然谈到错误的波特率、缓冲区溢出、帧错误或任何适用的问题。

getchar()
可以针对多个系统特定的I/O错误返回
EOF
getchar()
定义为等同于
getc(stdin)
,其本身等同于
fgetc(stdin)
,但它可以作为宏实现。以下是linux系统的可能原因列表:

返回值

成功完成后,
fgetc()
将返回下一个字节 从流指向的输入流。如果文件结束 流的指示器已设置,或者流是否位于- 文件,应设置流的文件结束指示器,并
fgetc()
应返回
EOF
。如果发生读取错误,则会显示错误 应设置流指示器,
fgetc()
应返回
EOF
, 并应设置
errno
,以指示错误

错误

如果需要读取数据并且:

EAGAIN
为文件描述符设置了
O_NONBLOCK
标志 底层流和线程将在
fgetc()
操作

EBADF
底层流的文件描述符不是有效文件 描述符打开以便读取

EINTR
由于接收到错误信息,读取操作被终止 信号,没有传输任何数据

EIO
发生了物理I/O错误,或者进程处于错误状态 后台进程组正在尝试从其 控制终端,并且调用线程 阻塞
SIGTTIN
或进程忽略
SIGTTIN
或 进程的进程组是孤立的。这个错误可能会 也可以根据实现定义的原因生成

EOVERFLOW
该文件是常规文件,已尝试读取 等于或超过与该对象关联的最大偏移量 相应的流

如果出现以下情况,
fgetc()
功能可能会失败:

ENOMEM
可用存储空间不足

ENXIO
请求是由不存在的设备发出的,或者请求 超出了设备的功能范围


fgetc
的手册页(其中
getchars
的ma页明确提到)列出了7个不同的错误;我不会称之为“没什么”。哪个手册页<代码>特别是可能发生错误的情况。好吧,您想列出一个错误列表,例如:“在操作过程中用锤子敲打硬盘”@ScottHunter:my system上的
fgetc
手册页没有列出七个不同的错误。
fgetc
的POSIX手册页有,但OP没有标记或说明POSIX。我认为我们可以从简单的示例或这些示例的公共语言翻译中获益。像
EAGAIN
:流被设置为不等待数据,但目前没有可用的数据<代码>EBADF:流已关闭<代码>EIO:硬件出现故障<代码>EOVERFLOW:程序读取超出文件末尾
ENOMEM
:内存不可用于为流创建缓冲区。