Общий вариант использования
Я пытаюсь реализовать базовую оболочку.
Описание
Мне нужно читать пользовательский ввод, пока не будут нажаты некоторые разделители, чтобы соответствующее действие моглобыть выполненным.Этим разделителем может быть один «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 буферизуется, поэтому содержимое не записывается на диск, пока не произойдет какое-либо событие, но как насчетстанд :: IStream.Это буферизовано?Если да, как это и как я могу обойти это поведение?
Кроме того, я пометил этот вопрос как «домашнюю работу», потому что, если это не школьное упражнение, это упражнение, которое яЯ пытаюсь сделать это самостоятельно, и я не хочу выбирать только библиотеку, которая реализует все это.