【问题标题】:C++ : cin while cout [closed]C ++:cin而cout [关闭]
【发布时间】:2014-12-25 21:01:07
【问题描述】:

好吧,我正在用 C++ 编写一个聊天,用于 linux 终端。即使我正在打字,我也想接收消息。基本上,一个非阻塞的cin。我设法通过创建一个线程来完成这项工作。但问题是传入的消息和我的输入正在合并在一起。

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

对不起我的英语。

【问题讨论】:

  • a) 不要使用(非同步的)线程。 b)当控制台的其余部分是输出部分时,输入“行”怎么样?对于设置光标位置等,NCurses 会有所帮助。
  • 你可能想看看这样的东西:en.wikipedia.org/wiki/Ncurses
  • 简短回答:cincout 不适合交互式输入,它们用于读取/写入 ,而不是来自用户。因此建议使用 ncurses 之类的东西,这是一个用于交互式用户输入的库。
  • 因为是功课,所以受限于基础课。
  • @KiraSan 只使用C++标准要求的平台无关类,这是不可能的。

标签: c++


【解决方案1】:

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

是的,但有点棘手:您需要为控制台禁用回显,并在最终用户键入时打印他输入的字符。

当你检测到传入的消息时,你需要做这三件事:

  • 清除最终用户迄今为止输入的行中的所有字符
  • 打印收到的消息
  • 在下一行打印到目前为止输入的字符。

最终结果如下所示:

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

【讨论】:

  • 到目前为止,这是最好的答案,它帮助我理解了。谢谢!
【解决方案2】:

我的想法是将不完整的客户端消息(尚未发送)存储在一个变量中,当程序接收到传入的消息时,它应该用退格键擦除客户端的消息,将传入的消息写入 cout,然后重写客户端的不完整消息。

不过我还没有检查过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多