“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
:内存不可用于为流创建缓冲区。