标准I/O的三种缓冲
来源:互联网 发布:阿里云ip段 编辑:程序博客网 时间:2024/05/31 19:31
最近,有几个同学让我看了一个程序,后来发现问题都是出在使用printf()函数进行输出时的缓冲模式造成的。比如这样的程序:
- #include <stdio.h>
- int main()
- {
- fprintf(stout,"1234");
- while(1);
- return 0;
- }
程序并不是很长,但是就这样的程序出现了一个问题:为什么进入死循环之后,并没有输出“1234”,这个与我们预想的完全不一样,还以为是自己的程序写错了,可是看了又看,就三行代码,怎么会出错呢?原来这个就是标准I/O的缓冲模式造成的。
基于流的标准I/O的缓冲模式有三种:全缓冲,半缓冲,无缓冲。
全缓冲:直到缓冲区被填满,才调用系统I/O函数。对于读操作来说,直到读入的内容的字节数等于缓冲区大小或者文件已经到达结尾,才进行实际的I/O操作,将外存文件内容读入缓冲区;对于写操作来说,直到缓冲区被填满,才进行实际的I/O操作,缓冲区内容写到外存文件中。磁盘文件通常是全缓冲的。
行缓冲:直到遇到换行符'\n',才调用系统I/O库函数。对于读操作来说,遇到换行符'\n'才进行I/O操作,将所读内容读入缓冲区;对于写操作来说,遇到换行符'\n'才进行I/O操作,将缓冲区内容写到外存中。由于缓冲区的大小是有限的,所以当缓冲区被填满时,即使没有遇到换行符'\n',也同样会进行实际的I/O操作。标准输入stdin和标准输出stdout默认都是行缓冲的。
无缓冲:没有缓冲区,数据会立即读入或者输出到外存文件和设备上。标准出错stderr是无缓冲的,这样保证错误提示和输出能够及时反馈给用户,供用户排除错误。
看了这个应该明白了,原来这个是行缓冲造成的。我们是试着把
fprintf(stout,"1234");
改为
fprintf(stout,"1234\n");
这样的话,当我们陷入死循环之前,"1234"已经显示在标准输出上了。或者我们把
fprintf(stout,"1234");
改为
fprintf(stderr,"1234");
这个结果和上面的结果是一样的,只不过显示在了标准错误输出上了。
如果你不想按照上面的两种修改方式进行,也可以按照下面的方式,将I/O的缓冲设置为无缓冲方式。
- #include <stdio.h>
- int main()
- {
- setbuf(stdout, NULL);
- fprintf(stout, "1234");
- while(1);
- return 0;
- }
这样修改之后的结果与前面两种方式修改之后的结果是一样的。
0
上一篇:erlang获取一个5900——65535之间不重复的一个数据
下一篇:互斥与同步
相关热门文章
- Python 包管理工具解惑
- Linux设备驱动程序学习(3-补...
- QEMU源码分析系列(二)
- Qt学习笔记---QNetworkAccessM...
- 环形缓冲区的C语言实现...
- test123
- 编写安全代码——小心有符号数...
- 彻底搞定C语言指针详解-完整版...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- 标准I/O的三种缓冲
- 标准I/O的三种缓冲
- 标准I/O缓冲
- 标准I/O缓冲
- 标准I/O函数库的缓冲
- 标准I/O库的缓冲机制
- 标准I/O缓冲机制
- 标准I/O库----缓冲
- 标准的I/O缓冲:全缓冲,行缓冲,无缓冲
- 标准I/O库与Unbuffered I/O(不带缓冲的I/O)函数
- 标准I/O缓冲:全缓冲、行缓冲、无缓冲
- 标准I/O缓冲:全缓冲、行缓冲、无缓冲
- 标准I/O缓冲:全缓冲、行缓冲、无缓冲 .
- 标准I/O缓冲:全缓冲、行缓冲、无缓冲
- 标准I/O的缓冲机制的实例讲解
- UNIX标准I/O的奇奇怪怪的缓冲
- 标准I/O缓冲 与 用户程序的行缓冲区
- 5.4 标准I/O库_缓冲
- 共享内存是最快的一种IPC方式
- erlang中的元组与列表的区别与联系
- Erlang App. Management with Rebar
- erlang 进制转换
- erlang获取一个5900——65535之间不重复的一个数据
- 标准I/O的三种缓冲
- iOS——代码自动布局
- arm概念区分
- 实现quartz定时器及quartz定时器原理介绍
- linux下mysql的操作
- 互斥与同步
- 关于c++的迭代器
- linux /dev/console、/dev/tty和/dev/null的区别
- 从7个方面简单学习shell的正则表达式
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
寒山寺门票多少钱一张
城外寒山寺的前几个字
苏州寒山寺周边住宿
姑苏城外寒山寺打一生肖
苏州寒山寺门票多少钱
苏州寒山寺门票价格
夜宿寒山寺古诗全文
姑苏城外寒山寺中姑苏是指
寒山诗
寒山诗全集
寒山诗300首
寒帝
寒帝传
太古龙帝决林寒全文
寒塘渡鹤影
寒影重
寒风吹彻
寒战雪
寒战2演员表
寒战2剧情解析
寒战3上映时间2019
寒战2高清国语免费观看
星际战甲冰雪寒霜
寒战3完整观看超清版粤语
寒战3手机免费观看
寒战3免费观看
寒战粤语在线播放
寒战2结局为什么放蔡走
寒战谁是内鬼
寒战2结局真正幕后boss是谁
寒战2为什么不抓蔡sir
寒战3是2019年上映吗
寒战2演员表大全
寒战1免费观看
寒战1国语
寒战1剧情解析
寒战1粤语在线播放
寒战1国语在线看
寒拼音
寒的拼音
一曝十寒的拼音