2015-11-01 232 views
4

我想要一些随机字符打印到控制台,然后通过"\b"删除。在这之后,我想把自己的变量放到它看起来像“随机化”的位置。问题在于它发生得太快。我想通过使用usleepsleep函数来延迟输出,但是当我使用它时,没有任何内容被打印到控制台中。
短例如:Linux上的C++延迟输出

#include <iostream> 
#include <unistd.h> 
using namespace std; 

int main() 
{ 
    char chars[]={'a','b','c','g','h','u','p','e','y'}; 
    for(int i=0; i<8; i++) 
    { 
     cout << chars[i]; 
     usleep(200000); 
     cout << "\b"; 

    } 
} 

回答

1

从GitHub试试我的小程序slowtty

它允许您通过延迟每个字符的输出来模拟旧的rs232c行的行为,因为stty(1)命令允许设置波特率。

您与

$ slowtty 
$ stty 1200 
$ 

把它和终端开始写字速度很慢(如1200baud线)

1

在许多系统输出进行缓冲。

为了确保您发送的内容出去cout真的被刷新出缓冲器的你所需要的睡眠

4

问题是,std::coutis line-buffered之前调用

cout.flush(); 

。它将所有输入存储在缓冲区中,直到遇到新行(或程序终止)。使用std::flush冲洗std::cout明确:

cout << chars[i] << flush; 

注:

  • 因为C++ 11,多线程和时间是标准化的。这带来了std::this_thread:sleep_for功能有了它,它应该用于便携式> = C++ 11的程序中使用:

    std::this_thread::sleep_for(std::chrono::milliseconds(200)); 
    
+0

@Downvoter有什么问题的答案? – Downvoter

+0

也许是因为['cout',而不是'std :: cout'](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice):) – ikh

+1

@ ikh我只是试图调整OP的代码,因此假设前面的'using'指令。 – Downvoter