Como o std :: iostream é armazenado em buffer?
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é agoraAté 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 perguntaSei 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 .