鱼C论坛

 找回密码
 立即注册
查看: 2998|回复: 5

c++ cout缓冲区刷新问题

[复制链接]
发表于 2014-2-9 21:53:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
    cout << "hello world ";
    while (true) ;
    return 0;
}
请问我的这个cout对象还没刷新缓冲区就输出了,书上写的是在程序结束才会刷新缓冲的,没刷新缓冲区也能输出吗?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-9 22:08:00 | 显示全部楼层
推荐你阅读一下《Advanced Programming in the UNIX Environment》这本书,里面讲解了ISO C标准的I/O函数的实现原理。标准c++类库中I/O实现估计也是类似方式。
程序结束前,程序会将缓冲区中的数据推送到相应的文件(这里是stdout)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-9 22:19:31 | 显示全部楼层

不是要刷新缓冲区才能把cout对象在缓冲区的内容输出到文件或者设备中吗?看你这本书的名字好像是英文的,我英文不大好.而且好像还是unix的环境
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-11 17:15:30 | 显示全部楼层
额,我用的是VS,好像VS的cout对象不经缓冲区的,刚才在linux下试了试,发现是经过缓冲区的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-11 19:54:57 | 显示全部楼层
achenging 发表于 2014-2-11 17:15
额,我用的是VS,好像VS的cout对象不经缓冲区的,刚才在linux下试了试,发现是经过缓冲区的

我刚在linux环境下测试了,实现原理同ISO C标准I/O实现原理一致。我就简单给你解释下吧。ISO标准的I/O采用了缓冲区来尽量减少read/write的调用次数(read/write属于系统调用,耗费时间比一般函数要多),以此来提高效率。缓冲区又分为全缓冲,行缓冲和无缓冲;常规文件的io一般使用全缓冲,stdin,stdout,stderr一般使用行缓冲。cout应该是针对于对stdout的写入,如果没有使用重定向,应该是采用的行缓冲,其特点就是如果遇到\n就将数据推送到文件,当然也可以主动写入(flush函数),或者缓冲区满时会将数据推送到文件中。程序正常结束前,不管是什么类型的缓冲区,缓冲区的数据均会写入相应文件中。
你的程序中,缓冲区未满也没有换行符,所以一直没有输出。如果在while中输出一段字符串,你就可以看到输出了,这是由于缓冲区满导致的数据写入到stdout。
另,我的测试均在linux下实现的,windows系统情况怎样,我也未知。不过只要是根据标准来的应该相差不大。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-13 19:04:28 | 显示全部楼层
路过看看= =!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 04:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表