作者:菠萝和尚 | 来源:互联网 | 2023-09-17 19:44
printf 无缓冲,cout 有缓冲;
缓冲刷新的时刻有:
1. 缓冲区满;
2. 输出 endl;
3. 显式调用 flush 函数;
4. 程序结束时。
★
C 中缓冲设置相关的函数:setbuf()
★
cout.setf(ios::stdio);
上述语句让 iostream 和 stdio 共用一个缓冲。
★
程序1:
////////////////////////////////////
#include "iostream.h"
#include "stdio.h"
int main()
{
cout << "ok1";
printf("%s", "ok");
cout << "ok2";
return 0;
}
////////////////////////////////////
程序1在 vc 6.0 里的输出结果为:
okok1ok2
其原因是:cout << "ok1"; 的时候没有刷新缓冲区,而 printf 输出后就刷新了。当 cout << "ok2"; 的时候,缓冲仍然没有被刷新。直到退出程序的时候,iostream 才刷新它的缓冲。所以 cout 的输出在 printf 后面。如果要顺序输出的话,在 cout 语句最后加上 << endl (cout << "ok1" << endl;),endl 会刷新缓冲的。
在 gcc 和 vs.net 中的输出正常,如下:
ok1okok2
程序2:
////////////////////////////////////
#include "iostream.h"
#include "stdio.h"
int main()
{
cout << "ok1";
printf("%s", "ok");
cout << "ok2";
for (int i = 1; i = 1; )
{
;
}
return 0;
}
////////////////////////////////////
程序2在 vc 6.0 里的输出结果为:
ok
其原因是:程序最后有个无限循环,所以cout没有机会被刷新(一般程序退出的时候 cout 会被刷新缓冲)。
在 gcc 和 vs.net 中的输出正常,如下:
ok1okok2
我觉得两个有冲突。按程序一的理解,那么程序二应该输出okok1应为printf应经刷新了缓冲区,我个人认为这三个字符串是按堆栈形式在内部存放的,即先最下面放ok1上面放ok最上面放ok2,所以printf刷新缓冲区时先输出ok再输出ok1程序结束后输出ok2.但是这样理解的话,在程序二中就应该输出okok1,但为什么只输出ok呢?
我用得VC6.0
7 个解决方案
printf属于标准I/0库,标准I/O的的输入输出是行缓冲的,所以printf无缓冲cout有缓冲的说法不正确。
printf实际上是输出向stdout,只有stderr一般才不缓冲。
这个问题还不能一概而论了。
windows和unix/linux上标准I/O库的默认行为还不一样。