Как читать символы до нажатия кнопки ESC из cin в C++

Мне нужно сделать while Цикл работает до нажатия кнопки ESC на клавиатуре.

char choose = NULL;
while( choose != 27)
{
    cout << "Choose (s), (e) or (n): ";
    cin.ignore();
    choose = cin.get();

    switch(choose){
    case 's': {SortRoutesByStartPoint(routeList, n); ShowRoutes(routeList, n, "Sorted list (s):"); break;}
    case 'e': {SortRoutesByEndPoint(routeList, n); ShowRoutes(routeList, n, "Sorted list (e):"); break;}
    case 'n': {SortRoutesByNumber(routeList, n); ShowRoutes(routeList, n, "Sorted list (n):"); break;}
    default: {cout << "Not found\n\n"; break;}
    }
}

Но когда я нажимаю кнопку ESC, это ничего не происходит. Зачем?
Как заставить это работать?

2 ответа

Решение

Простой ответ заключается в том, что вы не можете, по крайней мере, ненадежно, использовать стандартные потоки. Если вы вводите данные из терминала, вы получаете то, что дает ОС. И вообще, он ничего не дает, пока не нажата клавиша enter, и убирает много символов для редактирования строк и других вещей до этого; есть явное изменение, что ESC среди этих персонажей.

Когда вы хотите читать символ за символом (как вы, очевидно, делаете), вам нужна сторонняя библиотека, например, curses. Или вам придется самостоятельно писать много системно-зависимого кода.

#include <conio.h>

cout << "Choose (s), (e) or (n): ";
// cin.ignore();
// choose = cin.get();

choose =getche();
if(choice==0)  //an extended character code is next
  choice=getche();
Другие вопросы по тегам