zoukankan      html  css  js  c++  java
  • setbuf和freopen

          看memcached代码的时候学习了一个api,setbuf,可以设置文件流的缓冲区。

           #include <stdio.h>

           void setbuf(FILE *stream, char *buf);
           void setbuffer(FILE *stream, char *buf, size_t size);
           void setlinebuf(FILE *stream);
           int setvbuf(FILE *stream, char *buf, int mode , size_t size);

           使用技巧:

            setbuf(stdout, NULL);

            指定buf参数为NULL可以将文件指针设置为无缓冲的文件指针,和linux的open打开的文件描述符一样,写入data会立即刷新到文件。ps:linux下的stdout和stderr默认是没有缓冲区的,fprintf会直接输出到屏幕,这里的stdout泛指文件指针。

            char buff[2048] = {0};

            setbuffer(stdout, buff, sizeof(buff));

            可以给指定的文件指针设置指定大小的缓冲区,以后向该文件写入的data会先缓存起来,缓冲区溢出才会写入文件,这里的例子就给stdout设置了2048的缓冲区。

           

            freopen用来重定向文件流,经常重定向stdin、stdout、stderr。

           FILE *freopen(const char *path, const char *mode, FILE *stream);
           freopen("./0707.txt", "w", stdout);

           linux下的freopen和fopen一样,打开的文件默认有4096的缓冲区,写入data不会立即刷新到文件,不方便作为调试信息,可以在freopen后设置文件缓冲区为NULL。

           setbuff(stdout, NULL);

           

           经常用freopen+setbuf将程序运行结果输出到文件来调试。

           setbuffer是setbuff一族的另外一个重要api,频繁磁盘io是非常耗性能的,而setbuffer可以将频繁的小data io缓冲起来,减少访问磁盘的次数。可以极大的提升阻塞io的效率。

  • 相关阅读:
    无缝轮播图
    瀑布流之ajax
    进阶版轮播图
    桌面特效
    3D模型文字动画
    Razor 常用方法
    easyui常用
    C#
    Redis设置记录
    日志三剑客ELK
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/4626374.html
Copyright © 2011-2022 走看看