Интерактивная строка командной строки C ++ без ожидания символа новой строки - PullRequest
1 голос
/ 20 апреля 2019

Есть ли способ обработать ввод командной строки, прежде чем увидеть символ новой строки? Я подумываю о создании программы, которая поддерживает автозаполнение (например, в поисковых системах или на клавиатуре iOS).

Если быть более точным, моя программа будет запрашивать ввод пользователя при запуске, и для каждого ввода символов я хотел бы вывести что-то ДО символ новой строки (или EOF) вход.

Я попробовал следующий фрагмент кода:

int main(){
    char ch; 
    while ( (ch = cin.get()) != cin.eof() )
    {       
        cout << ch << flush;
    }   
}

ожидается: для каждого введенного символа выведите этот символ.

актуальный: ничего не выводится, пока программа не увидит eof.

1 Ответ

1 голос
/ 20 апреля 2019

В Unix-подобной системе вы можете добиться этого, изменив терминал на неканонический режим ввода. Терминал поддерживает канонический ввод , который собирает всю строку для редактирования до нажатия символа конца строки или Ctrl-D. В результате приложение часто видит целую строку в системных вызовах read (). С другой стороны, неканонический ввод не выполняет буферизацию строки; вводимые символы становятся доступными для программы, как только они набраны.

Вот пример Linux C / C ++, как программно установить флаг -icanon ( неканонический ).

#include <iostream>
#include <termios.h>
#include <unistd.h>
int main() {
    struct termios old_tio, new_tio;
    tcgetattr(STDIN_FILENO, &old_tio);
    new_tio = old_tio;
    new_tio.c_lflag &= (~ICANON);
    tcsetattr(STDIN_FILENO, TCSANOW, &new_tio);
    char c;
    while (fread(&c, 1, 1, stdin))
        std::cout << c << std::endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...