| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2290 人关注过本帖
标题:IO流与文件流的缓冲问题
只看楼主 加入收藏
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 
以下是引用yuyunliuhen在2007-3-20 21:49:15的发言:

cout是有缓冲的.cout要endl才能刷新缓存区,printf是即时刷新


没考证,如果是这样,那应该是
cout<<"写入文件:>";//输出缓冲区刷新,"写入文件:>"暂时未输出到设备
getche() //不经过缓冲区,所以缓冲区刷新,"写入文件:>"暂时未输出到设备
cout<<"写入完成!\n";//先刷新缓冲区,"写入文件:>"输出到设备
//然后将"写入完成!\n";写入到缓冲区

以上的话没考证,是猜想,有知道的大虾说一下

[此贴子已经被作者于2007-3-20 22:59:49编辑过]


为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-03-20 22:48
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 
以下是引用yuyunliuhen在2007-3-20 22:41:02的发言:

为什么 printf换成cout 后输出的顺序会变化?


cout是有缓冲的.cout要endl,flush()才或者能刷新缓存区,printf是即时刷新;
当两者混用的时候,cout刷新缓存区需要一定的时间,所以会比printf后输出


你上面两个程序的输出是一样的

[此贴子已经被作者于2007-3-20 22:50:01编辑过]


为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-03-20 22:49
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 
不会呀,把#include<iostream.h >换成
#include<iostream >
using namespace std;
怎么结果就变了呢?


#include<iostream.h >
#include "stdio.h"
main()
{
int iSize=1;
cout<<"cout iSize="<<++iSize+(++iSize)*iSize++<<"\n";
printf("printf iSize=%d \n",iSize);
return 0;
}

----------------------------------------------------
#include <iostream.h>
#include "stdio.h"
main()
{
int iSize=1;
cout<<"cout iSize="<<++iSize+(++iSize)*iSize++<<"\n";
cout.flush();
printf("printf iSize=%d \n",iSize);
return 0;
}

[此贴子已经被作者于2007-3-20 23:11:18编辑过]


Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-03-20 23:07
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 
以下是引用dlcdavid在2007-3-20 22:48:23的发言:

没考证,如果是这样,那应该是
cout<<"写入文件:>";//输出缓冲区刷新,"写入文件:>"暂时未输出到设备
getche() //不经过缓冲区,所以缓冲区刷新,"写入文件:>"暂时未输出到设备
cout<<"写入完成!\n";//先刷新缓冲区,"写入文件:>"输出到设备
//然后将"写入完成!\n";写入到缓冲区

以上的话没考证,是猜想,有知道的大虾说一下


缓冲区刷新条件:
1程序正常结束.(程序崩溃不刷新)
2缓冲区满,将在写下个值前刷新
3用操作符刷新,如endl.
4用unitbuf设置流内部状态.从而清空缓冲区
5如果输入输出流关联,在读输入流时刷新其关联输出缓冲区(cin.tie(&cout)可将cin与cout关联)
(一个ostream对象每次只能与一个istream对象绑在一起,传递cin.tie(0)取消捆绑)

------------------------------------------------------------------------------------------------------

以下是引用yuyunliuhen在2007-3-20 22:41:02的发言:

cout刷新缓存区需要一定的时间,所以会比printf后输出

理解错了,
在程序执行时cout的缓冲区一直没刷新

执行到printf的时候,他的输出立即显示到了设备上
退出程序的时候return才清空了cout的缓冲区
所以cout的输出才会在printf的后面

[此贴子已经被作者于2007-3-20 23:18:51编辑过]


为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-03-20 23:10
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
如yuyunliuhen所说,是缓冲流没有flush的原因

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-03-20 23:11
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 
以下是引用yuyunliuhen在2007-3-20 22:41:02的发言:

cout刷新缓存区需要一定的时间,所以会比printf后输出

理解错了,
在程序执行时cout的缓冲区一直没刷新

执行到printf的时候,他的输出立即显示到了设备上
退出程序的时候return才清空了cout的缓冲区
所以cout的输出才会在printf的后面


为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-03-20 23:16
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-03-20 23:22
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

13楼:我以前也碰到过,但是似乎是没打vc6sp6补丁之前,现在试了下,两个程序都是一样的输出。


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-03-20 23:31
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 
还是一样的输出吗,可是在我的机器上为什么会不同呢?我的版本是VC++ 6.0 SP6.大企龙卷风集成安装版的.

Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-03-20 23:44
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 
以下是引用dlcdavid在2007-3-20 23:16:23的发言:


在程序执行时cout的缓冲区一直没刷新

执行到printf的时候,他的输出立即显示到了设备上
退出程序的时候return才清空了cout的缓冲区
所以cout的输出才会在printf的后面

cout 这是一个流对象,没有刷新的功能,而是endl 有这个功能。它不但现了换行操作,而且还对输出缓冲区进行刷新。
在执行输出操作之后,数据并非立刻传到输出设备,而是先进入一个缓冲区,当适宜的时机(也就是你说的在退出程序的时候return吗?)后再由缓冲区传入,也可以通过操纵符flush进行强制刷新,这样当程序执行到flash之前,有可能前面的字符串数据还在缓冲区中而不是显示在屏幕上,但执行flash之后,程序会强制把缓冲区的数据全部搬运到输出设备并将其清空。而操纵符endl相当于<< "\n" << flush的简写版本,它先输出一个换行符,再实现缓冲区的刷新。
PRINR是即时刷新..
这样理解也可以吧?


Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-03-20 23:52
快速回复:IO流与文件流的缓冲问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016808 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved