2013-05-09 90 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