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

Общий вариант использования

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

Описание

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

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

> 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.Это буферизовано? Если да, то как и как обойти это поведение?

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

21
задан Bill the Lizard 15 September 2012 в 23:11
поделиться