行缓冲,全缓冲,无缓冲的详细介绍

一.标准IO缓冲区

1.1缓冲区的类型

行缓存:和终端相关的缓冲区就是行缓存 stdin stdout

全缓存: 和文件相关的就是全缓存 fopen打开的文件

不缓存:没有缓冲区 stderr

二.缓冲区的大小

2.2.1行缓存:大小1024

#include <head.h>

int main(int argc, const char* argv[])
{
    int ch;
    对于标准输入行缓存大小验证的时候,必须有输入才有数据
    scanf("%d", &ch);
    printf("size = %ld\n", stdin->_IO_buf_end - stdin->_IO_read_base);
     1024

    printf("size = %ld\n", stdout->_IO_buf_end - stdout->_IO_read_base);
     1024

    fprintf(stderr,"q121231qweqweqweqweqweqweqwe2");
    printf("size = %ld\n", stderr->_IO_buf_end - stderr->_IO_read_base);
    0
    while(1);

    return 0;
}

2.2.2全缓存:大小4096

#include <head.h>

int main(int argc, const char* argv[])
{
    FILE* fp;

    if ((fp = fopen("./tim.txt", "a+")) == NULL)
        PRINT_ERR("fopen error");

    fprintf(fp,"q121231qweqweqweqweqweqweqwe2");
    printf("size = %ld\n",fp->_IO_buf_end - fp->_IO_buf_base);
    //4096
    return 0;
}

2.2.3无缓冲:

为0

三.缓冲区的刷新时机

3.1行缓存的刷新时机

#include <head.h>

int main(int argc,const char * argv[])
{
    1.行缓存遇到换行符的时候会刷新缓冲区
     printf("hello world\n");
     while(1);
    
    2程序结束的时候行缓存也会被刷新
     printf("helloworld");

    3.当输入和输出切换的时候也会刷新缓冲区
     int ch;
     printf("helloworld");
     scanf("%d",&ch);
     while(1);

    4.当关闭文件描述符的时候也会刷新缓冲区
     printf("helloworld");
     fclose(stdout);
     while(1);

    5.调用fflush主动刷新缓冲区
     printf("helloworld");
     fflush(stdout);
     while(1);

    6.当缓冲区满也会刷新缓冲区
    int i;
    for(i=0;i<1028;i++){
        fputc('a',stdout);
    }
    while(1);
    return 0;
}

3.2全缓存的刷新时机:

#include <head.h>

int main(int argc,const char * argv[])
{
    FILE *fp;

    if ((fp = fopen("./hello.txt", "w")) == NULL)
        PRINT_ERR("fopen error");

    1.换行符不会刷新全缓存
    fprintf(fp,"hello world\n");
     while(1);
    
    2.程序结束的时候全缓存也会被刷新
     fprintf(fp,"hello world");

    3.当输入和输出切换的时候也会刷新全缓冲区
     int ch;
     fprintf(fp,"hello world\n");
     ch = fgetc(fp);
     while(1);

    4.当关闭文件描述符的时候也会刷新全缓冲区
     printf(fp,"hello world\n");
     fclose(fp);
     while(1);

    5.调用fflush主动刷新全缓冲区
     fprintf(fp,"hello world\n");
     fflush(fp);
     while(1);

    6.当缓冲区满也会刷新全缓冲区
    int i;
    for(i=0;i<4097;i++){
        fputc('a',fp);
    }
    while(1);
    return 0;
}
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值