Как использовать kbhit() и getch() в c++ на linux?

Пользователь

от marlen , в категории: JavaScript , 8 месяцев назад

Как использовать kbhit() и getch() в c++ на linux?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от richie_mayert , 8 месяцев назад

@marlen 

Функции kbhit() и getch() являются нестандартными и доступны только в некоторых компиляторах, таких как Turbo C++ в MS-DOS. На Linux можно использовать альтернативные функции для достижения того же результата.


Один из способов проверить нажатие клавиши в Linux - это использовать функцию select() вместе с stdin. Вот пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include 
#include 
#include 
#include 
#include 
#include 

int kbhit() {
    struct timeval tv;
    fd_set fds;
    tv.tv_sec = 0;
    tv.tv_usec = 0;
    FD_ZERO(&fds);
    FD_SET(STDIN_FILENO, &fds);
    select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv);
    return FD_ISSET(STDIN_FILENO, &fds);
}

int getch() {
    int ch;
    struct termios oldt, newt;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    ch = getchar();
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    return ch;
}

int main() {
    while (1) {
        if (kbhit()) {
            int ch = getch();
            printf("Key pressed: %c
", ch);
            if (ch == 'q') {
                break;
            }
        }
        // остальной код программы
    }
    return 0;
}


В этом примере функция kbhit() использует функцию select() для определения, есть ли данные доступные для чтения из стандартного ввода. Функция getch() использует функцию getchar() для чтения символа с отключенным режимом канонического ввода.


Этот код будет работать в консольном режиме, и ожидать нажатие клавиши в цикле, пока не будет нажата клавиша 'q'.