标准I/O的三种缓冲

来源:互联网 发布:阿里云ip段 编辑:程序博客网 时间:2024/05/31 19:31
    最近,有几个同学让我看了一个程序,后来发现问题都是出在使用printf()函数进行输出时的缓冲模式造成的。比如这样的程序:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     fprintf(stout,"1234");
  5.     while(1);
  6.     return 0;    
  7. }
    程序并不是很长,但是就这样的程序出现了一个问题:为什么进入死循环之后,并没有输出“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的缓冲设置为无缓冲方式。
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     setbuf(stdout, NULL);
  5.     fprintf(stout, "1234");
  6.     while(1);
  7.     return 0;
  8. }
    这样修改之后的结果与前面两种方式修改之后的结果是一样的。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(617) | 评论(0) | 转发(1) |
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...
给主人留下些什么吧!~~
原创粉丝点击