为什么cout立即输出?

Иго*_*кин 5 c++ io buffer cout output

cout是一个缓冲流.这意味着数据将被写入缓冲区,并在刷新流,程序终止或缓冲区完全填满时打印.

我制作了一个小程序来测试它是如何工作的,但我不明白为什么它会在满足上述任何条件之前打印出来.

#include <iostream>
#include <ctime>
using namespace std;

int main()
{
    cout << "Test";
    float secs = 5;
    clock_t delay = secs * CLOCKS_PER_SEC;
    clock_t start = clock();
    while (clock() - start < delay) { }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行时,在循环开始之前输出"Test".

为什么在程序终止之前我的输出没有缓冲?

sco*_*001 4

这里对此有一个很好的讨论。

来自其中一个答案:

每个 C++ 流都使用关联的流缓冲区对象来执行缓冲。

构造时std::cout,它使用与对象关联的流缓冲区stdout,在 中声明<cstdio>。默认情况下, 的操作std::cout可以与<cstdio>输出函数(例如std::printf().

实际上,同步通常意味着标准 iostream 对象和标准 stdio 对象共享缓冲区。- 是

如果std::ios_base::sync_with_stdio(false)被调用(在标准流上的任何输入或输出操作之前),标准 C++ 流独立于标准 C 流进行操作(即,它们切换到自己单独的流缓冲区)。

有关更多信息,请参阅cppreferencesync_with_stdio上的函数参考页面。

从该页面开始,该功能...

设置每次输入/输出操作后是否将标准 C++ 流同步到标准 C 流。

...实际上,这意味着同步的 C++ 流是无缓冲的,并且 C++ 流上的每个 I/O 操作都会立即应用于相应的 C 流的缓冲区。这使得自由混合 C++ 和 CI/O 成为可能。

但是,请注意在已经进行读取或写入之后调用此函数:

如果在标准流上发生 I/O 之后调用此函数,则行为是实现定义的:实现范围从无效到破坏读缓冲区。