c++终端应用程序并行输入和输出
c++ terminal application concurrent input and output
我正在尝试实现一个类似于聊天客户端的应用程序,在用户键入自己的消息时,消息可以到达该应用程序。
我将通过一个示例来解释我希望程序如何运行:在收到消息之前:
>user partial input
收到消息后:
>the new message
>user partial input(cursor is here)
相反,传入消息后自然发生的情况是:
>user partial input the new message
>(cursor is here)
在那之后,用户仍然可以使用退格删除他之前写的内容,但它不会显示在屏幕上,而且总体上用户界面混乱。
有没有什么方法可以在不使用ncurses的情况下实现所需的行为?
谢谢。
编辑:对不起,我忘了写我的环境是什么,是Cygwin。谢谢你的回答。
虽然ncurses可能是实现这一目标的最灵活、最简单的方法,但您可以自己完成一些工作。
你必须自己仲裁IO。您可以使用"\r"返回到没有ncurses或任何特定于平台的终端交互的行的开头。
总体流程为:
- 您有一个输入循环,它读取按字符顺序输入到输入缓冲器中。默认行为是每性格一旦您收到换行符,您将提交该行从缓冲区中,使用换行符
- 如果收到传入消息的通知,则应打印一个"\r"以将光标移回该行的开头,打印空格以清除该行,然后再打印另一个"\r\"以将指针恢复到开头,打印带有换行符的消息,然后打印当前缓冲输入
这里有很多边缘案例需要考虑,但ncurses并不是你唯一的选择。就我所测试的而言,这种技术在Windows和Linux上都有效。
如果不使用GUI或ncurses,就没有(实用的)解决方案。
几年前,我写过类似于ncurses的文章。它很小(两个简单的窗口),但与ncurses有关的代码不到100行,所以它几乎不是一个不可逾越的障碍。
ncurses的问题在于它一开始看起来(而且)有些古怪。这些文档并没有尽可能地提供帮助,也没有那么多人知道或关心它,所以当你把自己描绘成一个角落时,很难找到帮助。但如果你保持简单,你应该没事。
您可以自己将转义的控制序列发送到终端,但这与重新实现ncurses:)
是的,正如评论所说,您必须通过ncurses、ANSI代码或(可怕的)windows API与终端本身进行交互。没有办法使用标准流来实现这一点(作为流,它们只进行输入/输出,不进行显示或光标感知)。
此外,流公开了一个同步(阻塞)API,因此如果不使用线程或反应器,就无法从一个API中读取和写入另一个API。
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- C++多个输入和输出
- 制定带有输入和输出C++的时间表
- 字符的输入/输出操作
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- C++ 中的矢量重复输出输入
- 类中的重载函数(Students())是输出输入的信息,但它不起作用
- 函数以相反的顺序输出输入问题,并改进算法以解释相等的数字
- 在输出输入文本时对齐输入的文本
- 将多个文件输出/输入到桌面
- 输出输入c++的最短方式
- 将Crypto++中自动种子PNRG的输出输入一个字符串
- 输出输入的拼接版本