Я написал функцию getch для программы. Я не мог использовать проклятия, поскольку он ломает терминал для iostream
Я уже пользуюсь. Код:
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
вместо системных вызовов. Все работает нормально, если только ESC
key
, Я пытаюсь захватить стрелки, которые являются строкой, например, "\1B[A"
, Когда я обнаруживаю ESC
в качестве первого символа я также прочитал вторые два, чтобы получить полный код ключа.
Проблема в том, что это не должно происходить, когда я нажимаю ESC
так как это код 1B один. cin.get()
должен return EOF
когда буфер пуст во время чтения, но он просто останавливается.
Есть ли способ прочитать ESC
ключ на linux
без использования проклятий? Почему мое решение не работает?
Спасибо
После многих часов поисков я нашел решение. Я должен был использовать функцию чтения из unistd.h
Он заполняет массив заданного размера символами из ввода. При нажатии клавиши буфер заполняется всеми прочитанными символами (работает также на нескольких клавишах). Таким образом, ESC имеет просто {27,0,0, …, 0} и стрелку {27, ‘[‘, ‘A’, 0,0, …, 0}.
Я переписал свою функцию с помощью termios.h и поместил в библиотеку, так что любой может получить пользу.
Вот код:
ключ чтения на github
Других решений пока нет …