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的效率。

原文地址:https://www.cnblogs.com/learn-my-life/p/4626374.html