检查 stdin 是否有待处理的字节(用于转义序列)

标签 c io terminal stdin

在纯 C 语言中,如何在不阻塞的情况下检查标准输入是否有待处理的字节?

这样做的原因是处理多字节的转义序列。

例如,如果我使用 getchar() 并且用户按下 Ctrl-Up Arrow,那么 3 个字节会立即放入标准输入:1B 4F 41,但是 getchar() 只读取其中一个字节。在继续之前,我需要阅读所有这三个。不同的转义序列具有不同的长度,所以逻辑是如果第一个字符是转义字符,那么我读取当前缓冲区中的所有字符,然后将其作为转义单元处理。但是我不能用 getchar() 来做到这一点,因为它会在到达缓冲区末尾时阻塞。我需要知道缓冲区中有多少个字符。

最佳答案

标准C中没有这样的规定;您需要使用特定于操作系统的调用来进行非阻塞读取,或者我认为在这里更合适的是立即从输入中读取字节而不是等待换行符。对于后者,参见

setvbuf not able to make stdin unbuffered

注意:

the logic is that if the first character is an escape character then I read ALL characters currently in the buffer and then process that as an escape unit

这真的不是这样做的方法,如果按键被快速按下或被自动重复,或者说,你正在从一个按键日志文件中读取,将会失败。每个字节决定了还有多少字节的转义序列;你应该根据你已经看过的内容有条件地阅读。

关于检查 stdin 是否有待处理的字节(用于转义序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26390720/

相关文章:

c - 在C中的系统默认应用程序中打开文件

c - 将 C#defines 导出为 shell 变量

C 指针值 - LHS 值发生意外变化

c++ - boost mmap 性能与 native 内存映射

java - 关闭时未删除临时文件

perl - 如何确定STDIN是否已连接到Perl中的终端?

c++ - 海湾合作委员会 : Specifying static/dynamic libraries to build against

使用文件和格式化程序时,java txt 文件被覆盖

c - 如何编写具有颜色格式的执行C程序代码?

java - Android FFMPEG - 未创建输出文件