MyTetra Share
Делитесь знаниями!
getch() в Linux
Время создания: 06.12.2016 14:03
Текстовые метки: getch, linux, c
Раздел: Computer - Programming - C

getch() не входит в стандарт C, в линуксе ты его не найдешь. В винде эта функция есть в conio.h. Остальные известные функции, такие как getchar, cin, требуют подтверждения ввода (нажатия Enter). Попробуй такой вот код:


#include <stdio.h>


#ifndef __linux

#include <conio.h>

#else

#include <unistd.h>

#include <termios.h>


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;

}

#endif


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

{

int ch;


while (ch !=27) {

ch = getch();

printf("Key %c code %d\n", ch, ch);

}


return 0;

}


Нашел другой вариант:


#include <iostream>

#include <stdio.h>

#include <termios.h>

#include <unistd.h>

 

using namespace std;

 

int main()

{

 

     struct termios oldt,

     newt;

     int ch;

     tcgetattr( STDIN_FILENO, &oldt );

     newt = oldt;

     newt.c_lflag &= ~( ICANON | ECHO );

     tcsetattr( STDIN_FILENO, TCSANOW, &newt );

     ch = getchar();

     tcsetattr( STDIN_FILENO, TCSANOW, &oldt );

     cout<<ch;

 

}

Принцип следующий:


struct termios oldt, newt;

объявляются структуры, в которых будем хранить состояния терминалов. oldt - до приема клавиши, newt - во время приема.

int ch;

- в нее запишется нажатая клавиша.

Во время приема необходим неканоничный ввод. Для этого в строке 6 устанавливаются (точнее отключаются) флаги "каноничный" и "эхо".

tcsetattr( STDIN_FILENO, TCSANOW, &newt );

переключаемся в новый режим, перед этим запомнили старый режим (записали в oldt).

ch = getchar();

приняли клавишу

tcsetattr( STDIN_FILENO, TCSANOW, &oldt );

переключились в старый режим

cout<<ch;

вывели результат.

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

 
MyTetra Share v.0.53
Яндекс индекс цитирования