设为首页 加入收藏

TOP

C小程序 - setbuf和setvbuf
2012-12-04 12:29:56 来源: 作者: 【 】 浏览:372
Tags:程序   setbuf setvbuf

    以下每个小程序,都在sleep(100)的时候,去cat文件12345.txt的内容

    #include <stdio.h>

    main()

    {

    char * str = “abcde”;

    FILE * fp = fopen(“12345.txt”, “w”);

    fwrite(str, sizeof(char), strlen(str), fp);

    sleep(100);

    }

    $cat 12345.txt

    没有内容

    #include <stdio.h>

    main()

    {

    char * str = “abcde\n”;

    FILE * fp = fopen(“12345.txt”, “w”);

    fwrite(str, sizeof(char), strlen(str), fp);

    sleep(100);

    }

    $cat 12345.txt

    没有内容, 说明对于驻在磁盘上的文件通常是由标准I/O库实施全缓存的, 所以即使遇到换行符,也不会输出.

    #include <stdio.h>

    main()

    {

    char * str = “abcde”;

    FILE * fp = fopen(“12345.txt”, “w”);

    setbuf(fp, NULL); //设置无缓冲

    fwrite(str, sizeof(char), strlen(str), fp);

    sleep(100);

    }

    $cat 12345.txt

    abcde

    由于设置了无缓冲,所以直接就输出到文件了.

    #include <stdio.h>

    main()

    {

    char * str = “abcde”;

    char * buf = (char *)malloc(20);

    FILE * fp = fopen(“12345.txt”, “w”);

    setvbuf(fp, buf, _IOLBF, 20); //设置行缓冲

    fwrite(str, sizeof(char), strlen(str), fp);

    sleep(100);

    }

    $cat 12345.txt

    abcde

    这个结果很让我奇怪,我本来以为我设置了一个20长度的行缓冲区,但是我只是输出6个字符,没有填满缓冲区,所以不应该有输出到文件,但是没想到,在sleep的时候去cat文件,发现内容已经写到了文件中,说明行缓冲区已经被填满...我很疑惑,然后我尝试把行缓冲区的大小扩大到200

    #include <stdio.h>

    main()

    {

    char * str = “abcde”;

    char * buf = (char *)malloc(200);

    FILE * fp = fopen(“12345.txt”, “w”);

    setvbuf(fp, buf, _IOLBF, 200);

    fwrite(str, sizeof(char), strlen(str), fp);

    sleep(100);

    }

    $cat 12345.txt

    没有内容.扩大了行缓冲区后,这次没有内容输出到文件.所以我猜想内核肯定也会利用这个缓冲区做一些事情,而不只是单单把要输出的内容放进去,所以如果这个行缓冲区的大小比较小的话,虽然看起来能容纳下要输出的内容,但是很可能已经被系统内核的一些信息占了一些空间,所以有一点点输出也许就填满了缓冲区,从而就刷新到了文件里.不知道我这个理解对不对

    #include <stdio.h>

    main()

    {

    char * str = “abc\nde”; //在要输出的字符串中间加上换行符,强制刷新缓冲区

    char * buf = (char *)malloc(200);

    FILE * fp = fopen(“12345.txt”, “w”);

    setvbuf(fp, buf, _IOLBF, 200);

    fwrite(str, sizeof(char), strlen(str), fp);

    sleep(100);

    }

    $cat 12345.txt

    abc

    可以看到,换行符之前的字符串已经输出了,后面的还在缓冲区里没有输出的文件.另外让程序自行结束后,

    $cat 12345.txt

    abc

    de

    可以看到,剩下在缓冲区的内容,在程序退出时候,标准I/O库会自动关闭此流并刷新缓冲区.

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言在输入空格的方式 下一篇C语言的HashTable简单实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: