我正在尝试一些c ++ 11代码,我尝试编写一个从10开始倒数的程序,在输出之间休眠。这就是我到目前为止所拥有的:
#include <iostream>
using namespace std;
#include <chrono>
#include <thread>
void Sleep(int x)
{
std::this_thread::sleep_for(std::chrono::duration<int>(x));
}
int main()
{
for (int x=10; x>0; x--) {
cout << x << "...";
Sleep(1);
}
cout << " FIRE!!\n";
}
问题是,这段代码会等待10秒然后打印所有输出,而不是从10开始倒计时。这是怎么回事?我该如何解决?
(顺便说一下,我在运行Linux Mint 17和MacOSX 10.9的计算机上试过这个,两次都得到了相同的结果)
答案 0 :(得分:10)
可能是因为您没有刷新输出。试试这个
cout << x << "..." << flush;
可以缓冲流输出,这意味着结果并不总是立即显示。刷新至少会增加你立即看到一些输出的机会。
答案 1 :(得分:1)
每次循环时都需要刷新输出,否则运行时系统将等待缓冲区已满或(有时)要发送的行结束。
此外,使用std::chrono::duration<>
时,如果可能,最好使用其中一种明确定义的类型以提高可读性。在这种情况下,您将在秒中测量时间,因此我在您的示例中使用了std::chrono::seconds
:
#include <iostream>
using namespace std;
#include <chrono>
#include <thread>
void Sleep(int x)
{
// better to use explicit types for duration
// for readability
std::this_thread::sleep_for(std::chrono::seconds(x));
}
int main()
{
for(int x = 10; x > 0; x--) {
cout << x << "..." << std::flush; // need to flush here
Sleep(1);
}
cout << " FIRE!!\n";
}