Linux中std :: cout的奇怪行为

时间:2011-03-25 20:15:06

标签: c++ printing cout

我正在尝试使用for以2个嵌套std::cout周期打印结果。但是,结果不会立即打印到控制台,但会有延迟(在循环或程序完成后)。

我不认为这种行为正常,在Windows打印下工作正常。该程序不使用线程。

哪里可能是问题? (Ubuntu 10.10 + NetBeans 6.9)。

2 个答案:

答案 0 :(得分:9)

std::cout是一个流,它是缓冲的。您可以通过以下几种方式进行冲洗:

std::cout.flush();

std::cout << std::flush;

std::cout << std::endl;  // same as:  std::cout << "\n" << std::flush`

<小时/> 约翰尼拉:

  

我使用std :: endl在循环之前刷新缓冲区。当打印点表示循环内处理数据的百分比时,会出现问题。

如果在循环之前清空缓冲区,则不会影响循环中的输出 。你必须在循环中或之后进行冲洗,以查看输出。

答案 1 :(得分:1)

如果您没有刷新输出,则无法保证您的输出在程序外可见。它不在您的终端中打印的事实只是在输出为tty时linux中默认行为进行行缓冲的结果。如果你在linux上运行你的程序,其输出通过管道输送到另一个东西,比如

 ./your_program | cat

然后默认缓冲区将更大,最可能的是至少4096字节。因此在大缓冲区满了之前不会显示任何内容。但实际上,除非你自己刷新std :: cout,否则行为是特定于操作系统的。

要刷新std :: cout,请使用:

std::cout << std::flush;

另外,使用

std::cout << std::endl;

的捷径
std::cout << '\n' << std::flush;