C++ : cin while cout

4

我正在用C++编写一个可以在Linux终端中使用的聊天系统。我希望能够即使在我输入时也能接收到消息。基本上,需要一个非阻塞的cin。我通过创建线程成功实现了这一点。但是问题在于收到的消息和我正在输入的消息被混合在一起。

有没有办法将来自cout的其他行与cin行分开?

对不起我的英语。


1
a) 不要使用(不同步的)线程。 b) 在控制台的其余部分是输出部分时,如何输入“行”?为了设置光标位置等,可以使用NCurses。 - deviantfan
2
你可能想看一下这个:https://zh.wikipedia.org/wiki/Ncurses - Galik
1
简短回答:cincout不适用于交互式输入,它们用于从/向读取/写入数据,而不是从用户处获取数据。因此,建议使用像Ncurses这样的库来进行交互式用户输入。 - Konrad Rudolph
由于这是一项作业,我只能使用基本类。 - Ikbel
1
@KiraSan 仅使用C++标准所需的平台无关类是不可能的。 - deviantfan
2个回答

7
有没有办法将来自cout的其他行与cin行分开显示?
是的,但有点棘手:需要禁用控制台的回显,并在用户输入时打印已键入的字符。
当检测到传入消息时,需要执行以下三个操作:
  • 清除目前为止结束用户输入的所有字符
  • 打印传入消息
  • 在下一行上打印到目前为止输入的字符。
最终结果应如下所示:
Friend: How are you?                        <== This is your friend's prior message
You: > I am fi                              <== This is the text you've entered so far

当你还没有打完上一条消息时,下一条消息已经到来,你可以将最后几行重新排列如下:

Friend: How are you?                        <== This is your friend's prior message
Friend: Are you coming to school tomorrow?  <== This is the new line that came in as the user was typing
You: > I am fi                              <== This is the text you've entered so far, re-printed again

到目前为止,这是最好的答案,它帮助我理解了。谢谢! - Ikbel

3
我的想法是将未发送的客户端消息存储在一个变量中,当程序接收到传入消息时,应该使用退格键清除客户端消息,将传入消息写入控制台,然后重新编写客户端未完成的消息。
我尚未检查。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接