std :: cin接收输入时不应该输入

时间:2015-12-22 07:28:15

标签: c++ multithreading std iostream chrono

我最近遇到了std::cin的问题,当我尝试将其与std::this_thread::sleep_for()结合使用时,它开始得到一个输入,当它甚至没有叫了。

以下是我一直在使用的代码:

#include <iostream>
#include <chrono>
#include <thread>
#include <string>

using std::string
using namespace std::this_thread
using namespace std::chrono

int main(){
    string a;
    sleep_for(seconds(3)); //start typing around now
    std::cin >> a;         //the text typed during the sleep_for() shows up now
    return 0;
}

当您在sleep_for()期间开始输入时,文本会在调用std::cin后显示。我想知道是否有人知道如何解决它以及它为什么会发生。

2 个答案:

答案 0 :(得分:2)

出现的原因是涉及两个组件并且它们独立运行:

  • 第二个组件是您的程序。它通常做的只是它的内部资料以及通过stdin,stdout和stderr与外界的沟通。
  • 第一个组件是控制台(终端[模拟器],命令行,DOS框...有各种名称),它实际上显示程序的输出,并从程序的键盘接收输入。

控制台独立工作,这意味着即使您的程序尚未请求输入,它也会为您的程序收集输入。此输入被缓冲并发送到您的程序,您将在需要时收到它。

现在,你能做些什么呢?首先,您可以编写自己的控制台,其行为与您希望的一样,但这远非琐碎。其次,有通过所谓的转义序列与控制台通信的方法。这些序列例如允许您显示颜色或粗体字,但它们不是标准化的,因此它们依赖于控制台,因此获得可靠的结果也是非常重要的。但是,有像这样的库。 &#34;咒骂&#34;以及其他各种名字相似的人。这些甚至允许您在控制台内创建基于文本的窗口,这些窗口应该是要查看的窗口。

答案 1 :(得分:0)

在Linux中你可以这样做:

...
std::cin >> a;         //the text typed during the sleep_for() shows up now
cout << "\e[A";. // move cursor up

for(size_t i=0; i<a.size(); i++){
    cout << "\b \b"; // erase one character
}

那说,在Linux sleep_for上,不会立即停止显示输入的文本。

我不确定是否有相同的窗口可以向上移动光标。