2013-12-06 4 views
1

Я написал функцию getch для программы. Я не мог использовать проклятия, поскольку он разбивает терминал на iostream. Я уже использую. Код:Чтение ESC на Linux во время небуферизованного ввода в C

inline std::string getch() { 
    char inp[4]; 
    system("stty raw"); 
    inp[0] = std::cin.get(); 
    if(inp[0] == 27 && (inp[1] = std::cin.get()) != std::char_traits<char>::eof()) { 
     std::cin>>inp[2]; 
     inp[3] = '\0'; 
    } 
    else { 
     inp[1] = '\0'; 
    } 
    system("stty cooked echo"); 
    return std::string(inp); 
} 

Я знаю, что было бы лучше использовать termios.h вместо системных вызовов. Все работает отлично, за исключением случаев, когда ESCkey. Я пытаюсь захватить стрелки, которые являются строками, например, "\1B[A". Когда я обнаруживаю ESC в качестве первого символа, я также читаю два вторых, чтобы получить полный код ключа. Проблема в том, что она не должна возникать, когда я нажимаю ESC, так как это код 1B. cin.get() должен return EOF, когда буфер пуст во время чтения, но он просто останавливается.

Есть ли способ читать ESC ключ на linux без использования проклятий? Почему мое решение не работает?

Thanks

+1

Нет, используйте 'ncurses' или, возможно,' readline' библиотеки. Другие решения не являются практичными, если вы не знаете очень хорошо 'tty'-s .... –

ответ

1

После многих часов поиска я нашел решение. Мне пришлось использовать функцию чтения из unistd.h Он заполняет массив заданного размера, с символами ввода. Когда клавиша нажата, буфер заполняется всеми прочитанными символами (работает также на нескольких клавишах). Таким образом, ESC имеет просто {27,0,0, ..., 0} и стрелку {27, '[', 'A', 0,0, ..., 0}. Я переписал свою функцию с помощью termios.h и поместил ее в библиотеку, чтобы любой мог воспользоваться.

Вот код: readkey on github

+0

Рад, что это работает. В тот же день программы, которые хотели различать нажатие клавиши эвакуации и нажатие клавиши стрелки или цифровой клавиатуры, должны были использовать значения терминов 'VTIME' и' VMIN'. Считалось, что несколько символов, появившихся в течение нескольких десятых секунды друг от друга, взяты из стрелки или цифровой клавиатуры. –

 Смежные вопросы

  • Нет связанных вопросов^_^