【发布时间】:2012-04-15 00:13:05
【问题描述】:
一般用例
我正在尝试实现一个基本的 shell。
说明
我需要读取用户输入,直到按下某些分隔符,以便执行相应的操作。这些分隔符可以是单个“a”、单个“b”或单个“c”。
输入示例如下所示(> 是 shell 提示符):
> 111-222-333-444a
Ok, '111-222-333-444' entered
为什么我需要内联分隔符而不是“换行”分隔符?
因为我想听诸如“向上箭头”之类的键盘事件来擦除当前命令并打印最后一个命令(实现历史功能)。
因为我想听'tabulation'之类的键盘事件来自动完成当前命令(实现自动完成功能)。
到目前为止我所拥有的
到目前为止,我的代码如下所示:
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 呢?缓冲了吗?如果是,它是怎么回事,我有什么选择来绕过这种行为?
另外,我将此问题标记为“家庭作业”,因为如果不是学校练习,这是我自己尝试做的练习,我不想只选择一个实现所有这玩意儿。
【问题讨论】:
-
这个问题描述得很好,目标明确,背后的推理和示例代码。希望更多的人花时间这样做。