У меня есть программа, которая сканирует вход пользователя с помощью я = getchar(); и это работает. Чтобы запретить пользователю нажимать Enter каждый раз, когда я использовал это:
tcgetattr(STDIN_FILENO,&old_tio);
new_tio=old_tio;
new_tio.c_lflag &=(~ICANON & ~ECHO);
tcsetattr(STDIN_FILENO,TCSANOW,&new_tio);
И я перезагрузился:
tcsetattr(STDIN_FILENO,TCSANOW,&old_tio);
После этого пользователь должен ввести что-то. Я использовал это для этого:
string userinput;
cin >> userinput;
Но консоль не отображает напечатанный текст (при наборе текста). Я попытался повторно включить локальное эхо вручную:
tcsetattr(STDIN_FILENO,TCSANOW,&old_tio);
old_tio.c_lflag |= ECHO;
Но консоль все еще не показывает локальное эхо It 10pm, и я очень сонный, поэтому мой вопрос может быть очень легко ответить
Ваш вызов для набора был вызван до того, как вы изменили атрибут:
tcsetattr(STDIN_FILENO,TCSANOW,&old_tio);
old_tio.c_lflag |= ECHO;
Переключите заказ, и он должен работать.
Код работает для меня (см. Ниже). Возможно, стоит проверить, что все системные вызовы действительно успешны. Кроме того, вы не указали весь код: я мог предположить, что переход к восстановленному режиму ввода не был выполнен. Поскольку я не могу воспроизвести проблему, я не могу прокомментировать, почему она не работает.
Вот код, который я использовал для тестирования:
#include <termios.h>
#include <iostream>
#include <string>
int main()
{
termios old_tio, new_tio;
int rc = tcgetattr(0,&old_tio);
std::cout << "rc1=" << rc << '\n';
new_tio=old_tio;
new_tio.c_lflag &=(~ICANON & ~ECHO);
rc = tcsetattr(0,TCSANOW,&new_tio);
std::cout << "rc2=" << rc << '\n';
std::string value;
if (std::cin >> value) {
std::cout << "value='" << value << "'\n";
}
rc = tcsetattr(0,TCSANOW,&old_tio);
std::cout << "rc3=" << rc << '\n' << std::flush;
if (std::cin >> value) {
std::cout << "value='" << value << "'\n";
}
}