关于windows下printf缓冲

dreamzme 2011-09-15 04:52:46
printf属于行缓冲机制,在linux平台下,并无任何问题。
但在windowsVC调试中,如下代码:
int main(void)
{
printf("hello, world");
while(1);

return 0;
}
在linux下面是没有输出的,因为没有换行符,缓冲没写满;但是在windows下面,总是能看到输出,这是何种原因,在windows下面printf是无缓冲的吗?buff是在内核里面的吗?对缓冲机制实在懵懂。
...全文
883 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
星羽 2011-09-21
  • 打赏
  • 举报
回复


setvbuf(stdout, NULL, _IOFBF, 1024);
printf("hello");

pp0354030 2011-09-21
  • 打赏
  • 举报
回复
printf在linux下终端是行缓冲,文件是全缓冲!windows下printf的缓冲机制不太清楚!
AndyZhang 2011-09-20
  • 打赏
  • 举报
回复
其实输出了,只不过你看不到而已
hyztcy 2011-09-20
  • 打赏
  • 举报
回复
建议楼主去看标准输入输出 输入输出流
dreamzme 2011-09-19
  • 打赏
  • 举报
回复
没有答案,好吧,windows是非主流。
luciferisnotsatan 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jackyjkchen 的回复:]

引用 17 楼 taodm 的回复:

这个知识的出处?具体是C语言标准的哪条?

引用 8 楼 dreamzme 的回复:
如果按照标准,printf属于行缓冲,那么在
1、没有遇到换行符
2、没有达到缓冲区上线
3、没有调用fflush缓冲函数
没有以上三种情形之一的话,在执行到while(1)的时候是不个应……


unix环境高级编程说标准IO的终端缓冲是行缓冲,……
[/Quote]
这本书里也就是说大多数xnix实现,对终端是行缓冲,但好像没说什么标准里规定了一定要用行缓冲。

赵4老师 2011-09-19
  • 打赏
  • 举报
回复
int main(void)
{
printf("hello, world");
fflush(stdout);//加这句再试试
while(1);

return 0;
}
dreamzme 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 taodm 的回复:]

这个知识的出处?具体是C语言标准的哪条?

引用 8 楼 dreamzme 的回复:
如果按照标准,printf属于行缓冲,那么在
1、没有遇到换行符
2、没有达到缓冲区上线
3、没有调用fflush缓冲函数
没有以上三种情形之一的话,在执行到while(1)的时候是不个应……
[/Quote]
Steven 的Unix高级环境编程有比较详细的讲解。
dreamzme 2011-09-18
  • 打赏
  • 举报
回复
CSDN牛人都去哪儿了
ljhhh0123 2011-09-18
  • 打赏
  • 举报
回复
看一下printf的实现不就行了?
modicum_lf 2011-09-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jackyjkchen 的回复:]
引用 17 楼 taodm 的回复:

这个知识的出处?具体是C语言标准的哪条?

引用 8 楼 dreamzme 的回复:
如果按照标准,printf属于行缓冲,那么在
1、没有遇到换行符
2、没有达到缓冲区上线
3、没有调用fflush缓冲函数
没有以上三种情形之一的话,在执行到while(1)的时候是不个应……


unix环境高级编程说标准IO的终端缓冲是行缓冲,文……
[/Quote]

++

阿尼小码 2011-09-18
  • 打赏
  • 举报
回复
值得学习
jackyjkchen 2011-09-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 taodm 的回复:]

这个知识的出处?具体是C语言标准的哪条?

引用 8 楼 dreamzme 的回复:
如果按照标准,printf属于行缓冲,那么在
1、没有遇到换行符
2、没有达到缓冲区上线
3、没有调用fflush缓冲函数
没有以上三种情形之一的话,在执行到while(1)的时候是不个应……
[/Quote]

unix环境高级编程说标准IO的终端缓冲是行缓冲,文件缓冲是全缓冲,stderr没有缓冲,至于是不是标准明确的就搞不清了
dreamzme 2011-09-18
  • 打赏
  • 举报
回复
有人能帮忙解决疑惑吗?
taodm 2011-09-18
  • 打赏
  • 举报
回复
这个知识的出处?具体是C语言标准的哪条?

[Quote=引用 8 楼 dreamzme 的回复:]
如果按照标准,printf属于行缓冲,那么在
1、没有遇到换行符
2、没有达到缓冲区上线
3、没有调用fflush缓冲函数
没有以上三种情形之一的话,在执行到while(1)的时候是不个应……
[/Quote]
「已注销」 2011-09-18
  • 打赏
  • 举报
回复
进来学习
贝隆 2011-09-18
  • 打赏
  • 举报
回复
学习一下
辰岡墨竹 2011-09-18
  • 打赏
  • 举报
回复
用setvbuf可以禁止行缓冲行为,或者用setbuf设置行缓冲为0。
但是这样会导致C库和BIOS中断(Windows虚拟的)之间的频繁的跳转,效率会明显下降。
所以比较合适的方法是用\n结束来强制刷新或者用fflush(stdout);
对stdout的fflush是C标准允许的。
AnYidan 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 athenacle_ 的回复:]
缓冲是肯定有的,,否则效率就不知道要下降多少了。。。
Windows和Linux的处理方式不同而已
[/Quote]
++
dreamzme 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jackyjkchen 的回复:]

有缓冲的,你用setbuf把缓冲给成0,然后循环printf会发现速度明显变慢

但是Windows对于控制台输出,有一个很有效的机制保证能尽快到达,具体就不清楚了
[/Quote]
应该是有,但是不明白windows的缓冲机制到底是如何工作的,以printf为例,windows不按常规出牌,让人抓狂啊。
加载更多回复(8)

70,036

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧