Функция cin не показывает локальное эхо
У меня есть программа, которая сканирует пользовательский ввод с помощью i=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;
Но консоль все еще не показывает локальное эхо. Сейчас 10 вечера, и я очень сонный, поэтому на мой вопрос очень легко ответить
2 ответа
Ваш вызов set был вызван до того, как вы изменили атрибут:
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";
}
}