функция cin не показывает локальное эхо

0

У меня есть программа, которая сканирует вход пользователя с помощью я = 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, и я очень сонный, поэтому мой вопрос может быть очень легко ответить

  • 1
    Вы уверены, что последние две строки не в том порядке?
  • 0
    странный. В old_io действительно должен быть флаг echo, поэтому ваша первая попытка сброса должна быть идеальной. Вы пытались проверить, какие флаги хранятся в переменных new_ и old_?
Показать ещё 1 комментарий
Теги:
console
input
cin

2 ответа

0
Лучший ответ

Ваш вызов для набора был вызван до того, как вы изменили атрибут:

tcsetattr(STDIN_FILENO,TCSANOW,&old_tio);
old_tio.c_lflag |= ECHO;

Переключите заказ, и он должен работать.

  • 0
    Спасибо! Работал
0

Код работает для меня (см. Ниже). Возможно, стоит проверить, что все системные вызовы действительно успешны. Кроме того, вы не указали весь код: я мог предположить, что переход к восстановленному режиму ввода не был выполнен. Поскольку я не могу воспроизвести проблему, я не могу прокомментировать, почему она не работает.

Вот код, который я использовал для тестирования:

#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";
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню