gpt4 book ai didi

C++ getchar() 是否还有数据等待读取

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:44 26 4
gpt4 key购买 nike

我正在用 c/c++ 实现一个关键阅读器程序。我正在使用 Linux。我知道无缓冲的 getchar 函数将返回键的小数据值。对于所有 ASCII 键(a-z、A-Z、1-9、标点符号、回车、制表符和 ESC),getchar() 将返回一个值。对于其他键,例如方向键,会读取 ESC 键,但是当再次调用 getchar() 时,它会得到另一个值(A、B、C 或 D)。

A = 65

B = 66

向上箭头 = 27 91 65

F5 = 27 91 49 53 126

ESC = 27

全表 here

有什么方法可以检查是否有更多字符要读取,或者是否只有一个字符?当读取一个键并且它的第一个值是 ESC 时,我不知道它是以 ESC 开头的功能键还是只是 ESC 键。

#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <iostream>
#include <string>
#include <termios.h>
#include <unistd.h>

using namespace std;

int main(int argc, char *argv[]) {

int ch[5];
int i;
struct termios term;

tcgetattr( STDIN_FILENO, &term );
term.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &term );

ch[0] = getchar();

// If ch[0] = 27 and there is more data in the buffer
// printf("You pressed a function key");
// Else
// printf("You pressed ESC");

return 0;

}

最佳答案

可以在逃逸的时候将stdio标记为非阻塞,然后尽可能多的读取。您需要包含

if (ch[0] == 27) {
int flags = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK);
for (;;) {
int c = getchar();
if (c == EOF)
break;
printf("%u ", c);
}
fcntl(STDIN_FILENO, F_SETFL, flags);
puts("\n");
}

两个键之间仍然存在问题,因为循环将读取直到没有更多数据可用。

关于C++ getchar() 是否还有数据等待读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16683804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com