Como o std :: iostream é armazenado em buffer?

Caso de uso geral

stou tentando implementar um shell básic

Descriçã

Preciso ler a entrada do usuário até que alguns delimitadores sejam pressionados para que uma ação correspondente possa ser executada. Esse delimitador pode ser um único 'a', um único 'b' ou um único 'c'.

Um exemplo de entrada ficaria assim (onde> é o prompt do shell):

> 111-222-333-444a
Ok, '111-222-333-444' entered
Por que eu quero delimitador embutido em vez de delimitador de 'nova linha'?

Por que eu gostaria de ouvir um evento do teclado como 'seta para cima' para apagar o comando atual e imprimir o último comando (implementando um recurso de histórico

Por que eu gostaria de ouvir um evento do teclado, como 'tabulação', para concluir automaticamente o comando atual (implementando o recurso de preenchimento automático

O que eu tenho até agora

Até agora, meu código fica assim:

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

No entanto, o loop parece ser executado somente depois que a tecla 'nova linha' foi pressionada. Esse comportamento mata a essência interativa da entrada do usuári

Qual é a pergunta

Sei que std :: ostream é armazenado em buffer para que o conteúdo não seja gravado no disco até que algum evento ocorra, mas o que acontece com std :: istream. Está em buffer? Se sim, como é e qual é minha opção para contornar esse comportamento?

Além disso, eu marquei esta pergunta como 'lição de casa' porque, caso não seja um exercício escolar, é um exercício que estou tentando fazer sozinho e não quero apenas escolher uma biblioteca que implemente tudo isso .

questionAnswers(4)

yourAnswerToTheQuestion