标准输出奇怪的行为

时间:2015-06-30 12:25:40

标签: c++ c++11 eclipse-cdt

我在使用Eclipse cdt时遇到了一个问题,我遇到了一个奇怪的行为:

cout << "Hello world" << endl;
aFunction();
// The output here is Hello world
// END

当我取消endl输出时什么都不是

cout << "Hello world";
aFunction();
// No output
// END

当我稍后放endl时,它可以正常工作:

cout << "Hello world";
aFunction();
cout << endl;
// output is Hello world
// END

现在,我无法提供功能代码,因为它需要我一千行。

然而,我尝试使用一个不执行任何操作的函数void toto(){}并且没有这个奇怪的东西。

cout << "Hello world";
toto();
// Gives me Hello world
// END

我想知道的是什么可以导致这个?

编辑: 使用foo的测试单独测试(没有其他说明), 在其他测试中,我初始化了一个结构,我将其作为参数提供给aFunction。该函数使用了一些元编程,我需要显示很多代码,以便您理解它。

3 个答案:

答案 0 :(得分:4)

写入流时,它们通常是缓冲,这意味着输出存储在内部缓冲区(内存块)中。当该缓冲区已满时,或者明确告知流时,刷新缓冲区并将输出实际写入文件或设备。

std::endl I/O manipulator不仅添加换行符,还会刷新流中的缓冲区,导致实际写入缓冲输出。

答案 1 :(得分:1)

std::endl添加新行刷新您提供给它的流。

您只需使用std::flush刷新流。

答案 2 :(得分:0)

尝试拨打

std::ostream::flush()

刷新流缓冲区。这项工作由endl完成,当你取消它时,消息在缓冲区中等待准备就绪,在缓冲区已满或新线路到来时刷新。

如果你愿意,你可以自己冲洗它。