为什么立即输出立即输出

Why is cout outputting immediately?

本文关键字:输出 为什么      更新时间:2023-10-16

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;
}

运行时,"测试"是在循环开始之前输出的。

为什么我的输出直到程序终止?

才能缓冲?

在这里有一个很好的讨论。

从其中一个答案中:

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

构造std::cout时,它使用与<cstdio>中声明的对象stdout关联的流缓冲区。 默认情况下,std::cout上的操作可以与<cstdio>输出功能(如std::printf())自由混合。

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

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

)。

有关更多信息,请参见cppreference上的sync_with_stdio功能参考页。

从该页面,功能...

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

...实际上,这意味着同步的C 流未掩盖,并且在C 流上的每个I/O操作都立即应用于相应的C流的缓冲区。这使得可以自由混合C 和C I/O。

但是,在已经读取或写入后要注意调用此功能:

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

这里还有另一个很棒的对话。这似乎与Scohe001提到的一些内容有关,但是有些不同,所以我将其放在自己的答案中。

与上述答案相关的是该论坛上的这篇文章,该文章谈到了如何根据其他周围代码冲洗缓冲区。STD :: COUT函数与其他流函数绑定,正常C库如所述的SCOHE001。因此,如果称之为与之绑定的东西,其缓冲区将在继续之前冲洗。

您是在Linux上使用GCC对此进行编译,还是在某些Windows环境中运行它?上面该论坛的这篇文章讨论了OS特定功能,并且Windows的Sleep()可能会导致缓冲区冲洗。否则,普通的GCC编译的C 代码不会使用Sleep()打印缓冲区,以至于它没有遇到任何其他代码,这些代码在继续之前都不会冲洗缓冲区。

这些上面的这些帖子涵盖了很多信息,所以我会在这里避免复制和粘贴,所以请原谅我stackoverflow gogs。

我希望此信息会有所帮助!