我最近遇到了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
后显示。我想知道是否有人知道如何解决它以及它为什么会发生。
答案 0 :(得分:2)
出现的原因是涉及两个组件并且它们独立运行:
控制台独立工作,这意味着即使您的程序尚未请求输入,它也会为您的程序收集输入。此输入被缓冲并发送到您的程序,您将在需要时收到它。
现在,你能做些什么呢?首先,您可以编写自己的控制台,其行为与您希望的一样,但这远非琐碎。其次,有通过所谓的转义序列与控制台通信的方法。这些序列例如允许您显示颜色或粗体字,但它们不是标准化的,因此它们依赖于控制台,因此获得可靠的结果也是非常重要的。但是,有像这样的库。 &#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上,不会立即停止显示输入的文本。
我不确定是否有相同的窗口可以向上移动光标。