2013-05-09 57 views
3

我正在寻找一个函数,它将在输入之前打印一个字符串。我知道这可能与printfgets,但我希望字符串留在输入的最后一行。输出在主线程中处理,输入在由主线程启动的另一个线程中处理。异步输入和输出/前缀后获取输入

例如,这是当前控制台窗口(I输入了stop -command中,“>”是前缀字符串):

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

当控制台输出一个新行,我想要的输入要始终在底线,就像这样:

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

我使用英巴卡迪诺C++ Builder的XE2与Win32和VCL支持。

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

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

您可以使用Win32 API的设置控制台光标和写入的位置。我对你想要的有点困惑,但你可以在光标处打印并移动它。只是在打印时,光标通常位于控制台的底部。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms686025(v=vs.85).aspx – RandyGaul 2013-05-09 16:05:47

+0

不要因任何原因使用'gets'。改用'fgets'。 – 2013-05-09 16:18:40

回答

4

你在找什么叫做异步输入/输出。

我做了什么来完成这项工作是跟踪每个键被按下并将其追加到一个字符串。

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

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

如果你愿意,你必须使用线程做一些小小的工作,但是我很确定我能够在没有太多努力的情况下完成大部分工作。

其他可能的资源:

+0

这样,虽然完全符合条件,但需要实现所有编辑功能(箭头移动,剪贴板操作等),否则有些用户会感到困惑。 – Inspired 2013-05-09 16:18:16

+0

这似乎是一个很好的解决方案。 – dengsn 2013-05-09 16:18:30

+0

@Inspired你是对的!我必须在自己编写这个功能。在纯粹的控制台环境中,您可能不允许复制/粘贴,但历史记录键非常有用。 – 2013-05-09 16:19:29

0

尝试滚动控制台的所有线路除了最后一行,然后打印您的留言在最后一行之前(如ScrollConsoleScreenBuffer会帮助你)。这样输入线将始终在它的位置。

+1

我明白你的答案,但你能否给我一个例子? – dengsn 2013-05-09 16:09:49