首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
C/C++
C语言
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结帖去...
管理菜单
页面风格切换
标准风格
老版本论坛
关于printf的刷新输出问题??
加为好友
发送私信
在线聊天
zhangjgbupt
等级:
可用分等级:
短工
总技术分:
60
总技术分排名:
118100
结帖率:
24.00%
发表于:
2007-08-04 13:22:32
楼主
书上都说printf在输出字符串的时候,只有在字符串的最后有‘\n’,或者调用函数fflush(),或紧跟着printf后有scanf之类的,字符串才会显示,但是我发现即使没有这些条件,它一样正常显示呀,那个高手给解释一下。
问题点数:
10
回复次数:
13
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
comman_ndsc
<Blog>http://blog.csdn.net/comman_ndsc/
等级:
可用分等级:
中农
总技术分:
2060
总技术分排名:
10605
发表于:
2007-08-04 13:35:52
1
楼 得分:
0
printf的刷新输出???有
------------------------
没听过这种说法啊!
书上都说printf在输出字符串的时候,只有在字符串的最后有‘\n’...
------------------------------------------------------------------
如果单单说输出字符串的话,我想应该是判断到 '\0 '的时候,显示,
printf ()函数主要还是用在格式输出上,没有像楼主说的那么复杂啊。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zhangjgbupt
等级:
可用分等级:
短工
总技术分:
60
总技术分排名:
118100
发表于:
2007-08-04 13:41:16
2
楼 得分:
0
有呀,输出都有缓冲区的,这个和缓冲区有关系,也就是说:按照书上说得,在遇到‘\n’,或者调用函数fflush(),或紧跟着printf后有scanf之类的,这三种情况就会刷新缓冲区,进而才能在显示出来
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
cceczjxy
本机来自地狱
等级:
可用分等级:
掌柜
总技术分:
15737
总技术分排名:
936
6
2
发表于:
2007-08-04 13:49:53
3
楼 得分:
0
有呀,输出都有缓冲区的,这个和缓冲区有关系,也就是说:按照书上说得,在遇到‘\n’,或者调用函数fflush(),或紧跟着printf后有scanf之类的,这三种情况就会刷新缓冲区,进而才能在显示出来
-------------------------------------------
这些情况是可用立即输出的,不过还有情况是你把输出设置成不缓冲,或则缓冲区设置的非常小.也会立即输出的
.在输出是,遇到缓冲区满了也会立即输出的.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
comman_ndsc
<Blog>http://blog.csdn.net/comman_ndsc/
等级:
可用分等级:
中农
总技术分:
2060
总技术分排名:
10605
发表于:
2007-08-04 13:53:05
4
楼 得分:
0
是有输入输出缓冲区一说
fflush(stdout)可以用来刷新(清空)标准输出缓冲区。
scanf()是刷新标准输入缓冲区
但这和printf ()能是否显示是没有关系的。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zhangjgbupt
等级:
可用分等级:
短工
总技术分:
60
总技术分排名:
118100
发表于:
2007-08-04 14:01:34
5
楼 得分:
0
printf ()能是否显示是没有关系的。
-----------------
先将字符串输出到缓冲区,如果缓冲区满了就从缓冲区输出到标准输出设备上。
是不是编译器默认的不缓冲呀???
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
comman_ndsc
<Blog>http://blog.csdn.net/comman_ndsc/
等级:
可用分等级:
中农
总技术分:
2060
总技术分排名:
10605
发表于:
2007-08-04 14:16:05
6
楼 得分:
0
printf将输出的数据传递给一个被称为缓冲区(buffer)的中介存储区域,缓冲区中的内容再向屏幕传输.
C规定缓冲区中的内容在如下三种情况向屏幕传输:缓冲区满,遇到换行符的时候或者需要输入的时候.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zhangjgbupt
等级:
可用分等级:
短工
总技术分:
60
总技术分排名:
118100
发表于:
2007-08-04 14:30:18
7
楼 得分:
0
对,是这意思,但是即使不满足这三种情况照样可以显示在屏幕上呀,我觉得是不是编译器默认不缓冲?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
Chiyer
星羽
等级:
可用分等级:
富农
总技术分:
46361
总技术分排名:
181
4
4
4
发表于:
2007-08-04 14:40:18
8
楼 得分:
0
★
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 也一样。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
comman_ndsc
<Blog>http://blog.csdn.net/comman_ndsc/
等级:
可用分等级:
中农
总技术分:
2060
总技术分排名:
10605
发表于:
2007-08-04 14:56:15
9
楼 得分:
0
对,是这意思,但是即使不满足这三种情况照样可以显示在屏幕上呀,我觉得是不是编译器默认不缓冲?
---------------------------------------------------------------------------------------
可以把输出设置为不缓冲的。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zhangjgbupt
等级:
可用分等级:
短工
总技术分:
60
总技术分排名:
118100
发表于:
2007-08-04 15:41:16
10
楼 得分:
0
那为什么在在 gcc 和 vs.net 中的输出正常输出会正常呢???
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qualcommbrew
qualcommbrew
等级:
可用分等级:
贫农
总技术分:
81
总技术分排名:
102926
发表于:
2007-08-04 16:15:51
11
楼 得分:
0
本人刚建一qq 39599204群(印证码 :C语言) 让有兴趣共同学习、共同提高、共同分享的同志加入。分享笔试、面试题让我们都可以拿高薪 哈哈 (欢迎上传面试,笔试题)本群建立48小时 还有22个名额 满了就没了 不会主动替人 请量解。哈哈
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
iambic
等级:
可用分等级:
掌柜
总技术分:
25027
总技术分排名:
444
4
4
3
发表于:
2007-08-04 16:22:41
12
楼 得分:
0
程序结束了会自动刷出缓冲区的。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
mymtom
mymtom
等级:
可用分等级:
富农
总技术分:
12005
总技术分排名:
1552
2
发表于:
2007-08-04 17:47:36
13
楼 得分:
0
楼主可以在Unix/Linux下试试下面的程序:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
(void)printf( "Hello! ");
fork();
return 0;
}
在fork之前加flush(stdout);
或者(void)printf( "Hello! "); 给为(void)printf( "Hello!\n ")
然后比较一下输出就明白了.
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结帖去...
管理菜单
页面风格切换
标准风格
老版本论坛
abc推荐给好友