C ++ getchar () есть ли данные, все еще ожидающие чтения

Я реализую программу чтения ключей на 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

полный стол Вот

Есть ли способ проверить, есть ли еще символы для чтения или только один символ? Когда читается ключ и его первое значение — 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;

}

4

Решение

Вы можете пометить stdio как неблокирующее, когда получите escape, а затем прочитайте как можно больше.
Вы должны включить <fcntl.h>

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");
}

По-прежнему существует проблема с двумя ключами друг за другом, поскольку цикл будет считываться до тех пор, пока больше не будет доступных данных.

0

Другие решения

После того, как вы получите первый символ ESC, вы можете читать другие символы без ожидания (например, установив c_cc [VMIN] = 0 и c_cc [VTIME] = 0 в структуре termios), тогда, если найденные вами символы не соответствуют шаблону функциональных клавиш Вы вставляете прочитанные вами символы в буфер для последующего чтения. Затем при следующем получении вы сначала возвращаете буферизованные символы, если они есть.

0

Добавьте getchar () внутри цикла и выйдите из цикла, когда введенный ключ — ENTER.
Например:

char ch[5];
int i=0;
while(1)
{
ch[i] = getchar();
if('\n'==ch[i])
{
break;
}
i++;
if(i==5)
{
break;
}

}
-1
По вопросам рекламы [email protected]