[英]Strange behaviour of std::cout in Linux
我正在尝试使用std::cout
在2个嵌套for
周期中打印结果。 但是,结果不会立即打印到控制台,而是会延迟(在两个周期或程序都完成之后)。
我认为这种行为不正常,在Windows下可以正常打印。 该程序不使用线程。
问题可能出在哪里? (Ubuntu 10.10 + NetBeans 6.9)。
std::cout
是一个流,并且已缓冲。 您可以通过几种方法冲洗它:
std::cout.flush();
std::cout << std::flush;
std::cout << std::endl; // same as: std::cout << "\n" << std::flush`
我在循环之前使用std :: endl刷新缓冲区。 当打印代表周期内已处理数据百分比的点时,会出现问题。
如果循环之前刷新缓冲区,不影响循环中的输出。 您必须在循环中或循环后冲洗,才能看到输出。
如果不刷新输出,则不能保证您的输出在程序外部不可见。 它不在您的终端中打印的事实仅仅是由于Linux在输出为tty时默认行行缓冲的结果。 如果您在Linux上运行程序,其输出通过管道传递到另一件事,例如
./your_program | cat
然后,默认缓冲区将大很多,最有可能的是至少为4096个字节。 因此,直到大缓冲区填满之前,什么都不会显示。 但是实际上,除非您自己刷新std :: cout,否则行为是特定于操作系统的。
要刷新std :: cout,请使用:
std::cout << std::flush;
另外,使用
std::cout << std::endl;
是通往的捷径
std::cout << '\n' << std::flush;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.