为什么立即输出立即输出
Why is cout outputting immediately?
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。
我希望此信息会有所帮助!
- 为什么我的代码在输出中增加了93天
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么rk4.do_step不输出C++中的初始条件
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我在输出端得到 nan?
- 为什么递归函数的最终输出是 5?
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 为什么输出精度没有正确舍入?
- 为什么这个程序的输出不如预期
- 有人可以向我解释为什么控制台输出 0 吗?
- 为什么文件不是由 F 流创建的,或者即使它是输出只是垃圾值?
- 为什么我的 if else 语句不起作用并从数组中输出正确的索引?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 执行此代码时,它不显示任何输出.为什么?
- 使用相同消息重新引发新异常会导致垃圾输出.为什么?
- 我的程序产生错误的输出.为什么
- 怪异的输出:为什么这段代码会给出任何有意义的输出,更不用说这个了
- %n格式说明符程序,在不同的编译器上提供不同的输出.为什么?
- 我的简单类函数中出现意外输出.为什么
- 如果语句不求值为false?程序给出奇怪的输出.为什么