Как буферизируется std :: iostream?

Общий случай использования

Я пытаюсь реализовать базовую оболочку.

Описание

Мне нужно прочитать пользовательский ввод, пока не будут нажаты некоторые разделители, чтобы можно было выполнить соответствующее действие. Этим разделителем может быть один «a», один «b» или один «c».

Пример ввода будет выглядеть так (где> это приглашение оболочки):

> 111-222-333-444a
Ok, '111-222-333-444' entered
Почему я хочу использовать встроенный разделитель вместо разделителя новой строки?

Потому что я хотел бы прослушать событие клавиатуры, такое как «стрелка вверх», чтобы стереть текущую команду и напечатать последнюю команду (реализуя функцию истории).

Потому что я хотел бы прослушать событие клавиатуры, такое как «табулирование», чтобы автоматически завершить текущую команду (реализуя функцию автозаполнения).

Что у меня пока

До сих пор мой код выглядит так:

bool done = false;
char c;
while (!done && std::cin.get(c))
{   
    switch (c)
    {
    case 'a':
        // Do something corresponding to 'a'
        done = true;
        break;

    case 'b':
        // Do something corresponding to 'b'
        done = true;
        break;

    case 'c':
        // Do something corresponding to 'c'
        done = true;
        break;

    default:
        // buffer input until a delimiter is pressed
        break;
    }
}

Однако цикл кажется выполненным только после нажатия клавиши «новая строка». Такое поведение убивает интерактивную сущность пользовательского ввода.

В чем вопрос?

Я знаю, что std :: ostream буферизуется, поэтому содержимое не записывается на диск, пока не произойдет какое-либо событие, но как насчет std :: istream. Это буферизовано? Если да, как это и как я могу обойти это поведение?

Кроме того, я пометил этот вопрос как «домашнее задание», потому что, если это не школьное упражнение, это упражнение, которое я пытаюсь выполнить самостоятельно, и я не хочу выбирать только библиотеку, которая реализует все это.

Ответы на вопрос(2)

Ваш ответ на вопрос