【问题标题】:The timing of std::cout output is strangestd::cout 输出的时间很奇怪
【发布时间】:2021-05-08 14:44:45
【问题描述】:
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;

int main()
{
    std::cout << "1";
    std::this_thread::sleep_for( std::chrono::milliseconds(1000) );

    std::cout << "2";
    std::this_thread::sleep_for( std::chrono::milliseconds(1000) );

    std::cout << "3";
    std::this_thread::sleep_for( std::chrono::milliseconds(1000) );

    return 1;
}
  

我希望每秒打印一次std::cout

但是当我运行这段代码时,结果值123会同时打印出来。

为什么?

请告诉我如何解决它。

【问题讨论】:

  • 缓冲,输出流有一个缓冲区,只有当它填满或者你用std::flushstd::endl请求它时才写入。有一个选项可以关闭此行为,但它有利于 IO 性能。在您的情况下,请在您的打印语句后添加std::flush(std::cout)

标签: c++ c++11 stl c++14


【解决方案1】:

std::cout 被缓冲:

C++11 27.4.2 [narrow.stream.objects]/3 : 对象 cout 控制输出到与对象 stdout 关联的流缓冲区

所以你需要显式地刷新这个缓冲区来得到你想要的。这里有一些方法可以做到这一点:

1.将operator&lt;&lt;std::flush 一起使用

std::cout << "1" << std::flush;

2.使用免费功能std::flush(std::basic_ostream)

std::cout << "1";
std::flush(std::cout);

3.使用成员函数std::cout::flush()

std::cout << "1";
std::cout.flush();

4.将operator&lt;&lt;std::endl 一起使用

std::cout << "1" << std::endl;

这当然也会插入一个换行符,这可能不是你想要的。

【讨论】:

    【解决方案2】:

    您可能需要在每次 cout 之后刷新标准流,否则它们可能会等到程序结束时才一次刷新所有内容。

    【讨论】:

      【解决方案3】:

      这是由于缓冲。 在每个cout 之后,您需要使用std::flush(std::cout); 之类的任何语句来刷新缓冲区。

      这可能会对你有所帮助。

      #include <iostream>
      #include <thread>
      #include <chrono>
      using namespace std;
      
      int main(){
          std::cout << "1";
          //std::this_thread::sleep_for( std::chrono::milliseconds(1000) );
          std::flush(std::cout);
      
          std::cout << "2";
          //std::this_thread::sleep_for( std::chrono::milliseconds(1000) );
          std::flush(std::cout);
      
          std::cout << "3";
          //std::this_thread::sleep_for( std::chrono::milliseconds(1000) );
          std::flush(std::cout);
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-29
        • 1970-01-01
        • 2015-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多