Функция 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";
    }
}
Другие вопросы по тегам