Общий прецедент
Я пытаюсь реализовать базовую оболочку.
Описание
Мне нужно прочитать ввод пользователя, пока не будут нажаты некоторые разделители, чтобы можно было выполнить соответствующее действие. Этим разделителем может быть одиночный 'a', один 'b' или один 'c'.
Пример ввода будет выглядеть так (где >
- приглашение оболочки):
> 111-222-333-444a
Ok, '111-222-333-444' entered
Зачем нужен встроенный разделитель вместо разделителя 'new-line'?
Потому что я хотел бы слушать событие клавиатуры, такое как "стрелка вверх", чтобы стереть текущую команду и распечатать последнюю команду (реализовать функцию истории).
Потому что я хотел бы прослушать событие клавиатуры, например "табуляцию", чтобы автоматически выполнить текущую команду (реализовать функцию автозаполнения).
Что я до сих пор
До сих пор мой код выглядит следующим образом:
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. Буферизовано ли оно? Если да, то как это и каков мой вариант обойти это поведение?
Кроме того, я отметил этот вопрос как "домашнюю работу", потому что, если это не упражнение в школе, это упражнение, которое я пытаюсь сделать сам, и я не хочу выбирать библиотеку, которая реализует все этот материал.