`
isiqi
  • 浏览: 16002163 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

关于 C/C++ 的输入输出缓冲

阅读更多


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



在多线程中用 printf 的话,其中的内容往往能在一个时间片内输出;而如果用 cout 的话,就不能够保证是否能在一个时间片内输出,即使加了 flush 或 endl 也一样。


参考:
1. http://topic.csdn.net/t/20020707/12/855968.html
2. http://bbs.sjtu.edu.cn/bbsanc,path,%2Fgroups%2FGROUP_1%2FACMICPC%2Ftemporary%2FD4D425840%2FM.1054035254.A.html
3. http://community.csdn.net/Expert/TopicView3.asp?id=5030264
分享到:
评论

相关推荐

    C/C++的全缓冲、行缓冲和无缓冲

    输入或输出缓冲区被填满,会进行实际I/O操作。其他情况,如强制刷新、进程结束也会进行实际I/O操作。 对于读操作来说,当读入内容的字节数等于缓冲区大小或者文件已经到达结尾,或者强制刷新,会进行实际的I/O操作,...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

    gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户...

    C_C++控制台界面编程 V3

    这是第三版,增加了大量关于键盘缓冲区操作和输入、输出操作的知识讲解,并修改了多处前两版中文字、语句错误的地方。 前两个版本由于我等级不够无法删除,此处留下前两版的地址,希望对大家有用。 第一版:...

    C++编程思想 pdf

    83&lt;br/&gt;6.2 解决输入输出流问题 86&lt;br/&gt;6.2.1 预先了解操作符重载 86&lt;br/&gt;6.2.2 插入符与提取符 87&lt;br/&gt;6.2.3 通常用法 88&lt;br/&gt;6.2.4 面向行的输入 90&lt;br/&gt;6.3 文件输入输出流 91&lt;br/&gt;6.4 输入输出流缓冲 93&lt;br/&gt;6.5...

    C 语言的输入输出和缓冲区

    学习C++必经之路,入门级知识总结,笔记本知识概况,一步一步的向上

    C++编程思想习题

    6.4输入输出流缓冲 6.5在输入输出流中查找 6.6strstreams 6.6.1为用户分配的存储 6.6.2自动存储分配 6.7输出流格式化 6.7.1内部格式化数据 6.7.2例子 6.8格式化操纵算子 6.9建立操纵算子 6.10输入输出流实例 6.10.1...

    c++.编程思想

    输入输出流介绍 83&lt;br/&gt;6.1 为什么要用输入输出流 83&lt;br/&gt;6.2 解决输入输出...输入输出流缓冲 93&lt;br/&gt;6.5 在输入输出流中查找 94&lt;br/&gt;6.6 strstreams 96&lt;br/&gt;6.6.1 为用户分配的存储 96&lt;br/&gt;6.6.2 自动存储分配 98&lt;br/&gt;...

    与基于Arduino Nano的Eurorack / Kosmo模块化合成器兼容的步进音序器。-C/C++开发

    该项目包含基于Arduino Nano的与Eurorack和Kosmo模块化合成器兼容的步进音序器的原理图和固件本项目...此处提供的原理图具有:8步,2个声音时钟/复位/翻转方向输入随机序列开关每步缓冲的门控输出每语音S的缓冲CV输出

    C++编程思想

    输入输出流介绍 83&lt;br/&gt;6.1 为什么要用输入输出流 83&lt;br/&gt;6.2 解决输入输出...输入输出流缓冲 93&lt;br/&gt;6.5 在输入输出流中查找 94&lt;br/&gt;6.6 strstreams 96&lt;br/&gt;6.6.1 为用户分配的存储 96&lt;br/&gt;6.6.2 自动存储分配 98&lt;br/&gt;...

    C++编程思想 例子和叙述讲解C++编程

    6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵算子 106 ...

    C++编程思想 编程

    6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵算子 106 ...

    C++编程思想.pdf

    6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵...

    C++编程思想(中文版) chm

    6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵算子 106 ...

    Thinking in C++高清版

    6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵算子 106 ...

    c++ 编程思想 (高清pdf)

    6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵算子 106 ...

    C++高级参考手册 完全自学 内容详细 讲解通俗易懂

    6.4 输入输出流缓冲 6.5 在输入输出流中查找 6.6 strstreams 6.6.1 为用户分配的存储 6.6.2 自动存储分配 6.7 输出流格式化 6.7.1 内部格式化数据 6.7.2 例子 6.8 格式化操纵算子 6.9 建立操纵算子 6.10 ...

    C++ 语言 详细教程电子版

    6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵算子 106 ...

    用C语言开发手机软件 -Windows+CE+6.0开发者参考

    2.2 文本输出 2.2.1 设备上下文属性 2.2.2 TextDemo示例程序 2.2.3 字体 2.2.4 未完成的任务 2.3 位图 2.3.1 设备相关位图 2.3.2 设备无关位图 2.3.3 DIB区域 2.3.4 绘制位图 2.3.5 AlphaBlending 2.4 线和形体 ...

    C++ 编程思想 打印版 pdf

    6.4 输入输出流缓冲 93 6.5 在输入输出流中查找 94 6.6 strstreams 96 6.6.1 为用户分配的存储 96 6.6.2 自动存储分配 98 6.7 输出流格式化 100 6.7.1 内部格式化数据 101 6.7.2 例子 102 6.8 格式化操纵算子 106 ...

Global site tag (gtag.js) - Google Analytics