【问题标题】:Asynchronous input and output/Get input after prefix异步输入输出/前缀后获取输入
【发布时间】:2013-05-04 04:21:23
【问题描述】:

我正在寻找一个在输入之前打印字符串的函数。我知道printfgets 可以做到这一点,但我希望字符串保留在给出输入的最后一行。输出在主线程中处理,输入在主线程启动的另一个线程中处理。

例如这是当前的控制台窗口(我输入了stop-command,'>'是前缀字符串):

[12:00:00] Starting server...
>stop

当控制台输出新行时,我希望输入始终在底行,如下所示:

[12:00:00] Starting server...
[12:00:01] Server started
>stop

我正在使用支持 Win32 和 VCL 的 Embarcadero C++Builder XE2。

编辑:我目前正在使用此代码,导致在 '>' 前缀之后打印输出:

char buf[256];
printf(">");
gets(buf);

【问题讨论】:

  • 您可以使用 win32 api 设置控制台光标并写入该位置。我对你想要什么有点困惑,但你可以在光标处打印并移动它。只是在打印时光标通常位于控制台的底部。 msdn.microsoft.com/en-us/library/windows/desktop/…
  • 永远不要以任何理由使用gets。请改用fgets

标签: c++ windows input console c++builder


【解决方案1】:

您正在寻找的是所谓的异步输入/输出。

为此,我所做的是跟踪每个被按下的键并将其附加到字符串中。

当你按下退格键时,它会删除添加到字符串中的最后一个字符,当你按下回车键时,它将提交当前命令。

当输出出现时,您清除正在输入的行,打印输出,然后向下移动光标并打印出您保存在字符串中的内容。

如果你愿意,你必须在线程方面做一些工作,但我很确定我能够在不费力气的情况下完成大部分工作。

其他可能的资源:

【讨论】:

  • 这种方式虽然完全符合条件,但需要实现所有编辑功能(箭头移动、剪贴板操作等),否则一些用户会感到困惑。
  • @Inspired 你是对的!我必须自己编写该功能。在纯控制台环境中,您可能不允许复制/粘贴,但历史记录键非常有用。
【解决方案2】:

尝试滚动控制台的所有行,除了最后一行,然后将您的消息打印到最后一行之前的行(类似 ScrollConsoleScreenBuffer 会帮助您)。这样输入行将始终在其位置。

【讨论】:

  • 我明白你的回答,但你能举个例子吗?
猜你喜欢
  • 2016-01-18
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多