c++ - 如何清除进程被阻止时发生的用户输入 (cin)?

标签 c++ input cin

我有一个 C++ 程序,可以在 std::cin 上接受用户的输入.在某些时候,它需要调用一个函数来打开一个 GUI 窗口,用户可以与之交互。当此窗口打开时,我的应用程序被阻止。我注意到,如果用户在我的应用程序窗口中键入任何内容,而另一个窗口打开,则不会立即发生任何事情,但是当控制权返回我的应用程序时,这些击键会立即全部生效。这是不可取的。我希望在应用程序被阻止时输入的所有击键都被忽略;或者,一种在应用程序重新获得控制权时将它们全部丢弃的方法,但保留对之后发生的击键使用react的能力。

Stack Overflow 上有各种问题可以解释如何清除一行输入,但据我所知,他们倾向于假设诸如“不需要的输入仅持续到下一个换行符”之类的事情。在这种情况下,情况可能并非如此,因为用户可以在应用程序被阻止时多次按下回车键。我尝试了多种方法( getline()get()readsome() ……),但它们通常似乎无法检测到 cin 何时暂时耗尽。相反,他们等待用户继续为 cin 提供内容。例如,如果我使用 cin.ignore(n) ,那么不仅在 GUI 窗口打开时键入的所有内容都被忽略,而且程序在用户键入内容时继续等待,直到总共 n。已输入字符。这不是我想要的 - 我想根据它们出现的及时位置忽略字符,而不是它们出现的在输入流中的位置。

现在用尽 cin 中的所有内容,然后停止寻找更多内容”的成语是什么?我不知道要搜索什么来解决这个问题。

我看到了this question ,这可能是相似的并且有一个答案,但答案要求使用 <termios.h> ,这在 Windows 上不可用。

最佳答案

没有可移植的方法来实现您正在尝试做的事情。您基本上需要将输入流设置为非阻塞状态,只要有任何字符就继续读取。

get()getline()将阻塞直到有足够的输入来满足请求。 readsome()仅处理流的内部缓冲区,并且仅用于非阻塞地提取已从流内部缓冲区中读取的内容。

在 POSIX 系统上,您只需设置 O_NONBLOCKfcntl()并保持 read()从文件描述符 0 开始,直到读取返回一个值 <= 0 (如果它小于 0 则有错误;否则没有输入)。由于操作系统通常会缓冲控制台上的输入,因此您还需要将流设置为非规范模式(使用 tcsetattr() )。完成后,您可能会恢复原始设置。

我不知道如何在非 POSIX 系统上做类似的事情。

关于c++ - 如何清除进程被阻止时发生的用户输入 (cin)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24119748/

相关文章:

c++ - MAC地址:pad missing left Zeros

Jquery 删除值为 x 的输入

javascript - 使用 jquery 获取选中单选按钮的值

C++在给程序一个.txt后从键盘读取(在in之后使用getline())

c++ - 如何确保 cin 正确打开文件?

c++ - 为什么 cin >> string 不能与 Visual C++ 2010 一起使用?

c++ - 模型更新时 QML ListView 默认行为

C++从树中检索对象

c++ - 使用 OpenCV 的目标检测项目

css - bootstrap 3 中的输入尺寸较小