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

时间:2014-10-15 19:39:46

标签: c io terminal stdin

在普通的C中,如何检查标准输入是否有未阻塞的字节?

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

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

1 个答案:

答案 0 :(得分:1)

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

setvbuf not able to make stdin unbuffered

注意:

  

逻辑是如果第一个字符是转义字符,那么我读取当前缓冲区中的所有字符,然后将其作为转义单元处理

这实际上并不是这样做的,如果快速按下或自动重复按键,或者说,您正在从密钥日志文件中读取,则会失败。每个字节确定有多少字节的转义序列;你应该根据你已经看到的情况有条不紊地阅读。