Я написал код на окнах, используя функцию getch()
из stdio
. Дело в том, что я должен использовать функцию ввода, которая не требует нажатия клавиши ввода.
Мой код компилируется и отлично работает на окнах. Однако это назначение должно выполняться на linux, и когда я пытаюсь это сделать, он говорит мне, что он не распознает getch()
(или _getch()
). Проблема в том, что в соответствии с назначением я не могу использовать другие stdio.h
но stdio.h
(и то же самое относится к добавлению флага), поэтому я не могу использовать curses.h
чтобы решить эту проблему.
Я также не могу использовать termios.h
и так далее, мы этого не узнали. Как я могу это решить? Есть ли другие варианты?
благодаря
Библиотечный подход к UNIX - это для нас ncurses, но это немного фреймворк, который не совсем тривиально настраивается. tcsetattr()
режим состоит в том, чтобы превратить стандартный входной поток в неканонический режим ввода с помощью tcgetattr()
и tcsetattr()
с файловым дескриптором 0
. Набрав необходимый код из памяти (т.е. Я не могу проверить его сейчас, и я, вероятно, забыл что-то важное), соответствующий код выглядит примерно так:
struct termios setings;
tcgetattr(0, &settings);
settings.c_lflags &= ~ICANON;
tcsetattr(0, &settings);
Очевидно, что реальная реализация проверит, что системные вызовы действительно успешны. Обратите внимание, что после этого кода std::cin
и stdin
будут немедленно реагировать на нажатия клавиш. В качестве прямого следствия пройдут все виды "смешных" персонажей. Например, когда используется клавиша удаления, вы увидите обратные символы (ctrl-H, char(7)
).
<termio.h>
(или библиотечную оболочку, похожую на ncurses), вы не получите установку, которая не ожидает клавишу ввода! Что ж, я думаю, что вы можете разыгрывать трюки на оболочке или читать псевдотермические сообщения, но это будет сложнее, чем использование tcgetattr()
и tcsetattr()
.
Мы не делаем чудеса в Linux. Вы либо используете другие вещи, кроме stdio.h
, или идите без какого-либо эквивалента getch
и делаете зависящее от нажатия Enter.
getchar()
может получить один символ, но не получит (по умолчанию) ответ, пока не будет нажата клавиша возврата. Вы должны отключить буферизацию, чтобы обойти это ограничение, однако ваш вопрос предполагает, что вам не разрешено это делать, то есть вы не можете выполнить это назначение.