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


    一.标准IO缓冲区

    1.1缓冲区的类型

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

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

    不缓存:没有缓冲区 stderr

    二.缓冲区的大小

    2.2.1行缓存:大小1024

    1. #include 
    2. int main(int argc, const char* argv[])
    3. {
    4.     int ch;
    5.     对于标准输入行缓存大小验证的时候,必须有输入才有数据
    6.     scanf("%d", &ch);
    7.     printf("size = %ld\n", stdin->_IO_buf_end - stdin->_IO_read_base);
    8.      1024
    9.     printf("size = %ld\n", stdout->_IO_buf_end - stdout->_IO_read_base);
    10.      1024
    11.     fprintf(stderr,"q121231qweqweqweqweqweqweqwe2");
    12.     printf("size = %ld\n", stderr->_IO_buf_end - stderr->_IO_read_base);
    13.     0
    14.     while(1);
    15.     return 0;
    16. }

    2.2.2全缓存:大小4096

    1. #include 
    2. int main(int argc, const char* argv[])
    3. {
    4.     FILE* fp;
    5.     if ((fp = fopen("./tim.txt""a+")) == NULL)
    6.         PRINT_ERR("fopen error");
    7.     fprintf(fp,"q121231qweqweqweqweqweqweqwe2");
    8.     printf("size = %ld\n",fp->_IO_buf_end - fp->_IO_buf_base);
    9.     //4096
    10.     return 0;
    11. }

    2.2.3无缓冲:

    为0

    三.缓冲区的刷新时机

    3.1行缓存的刷新时机

    1. #include 
    2. int main(int argc,const char * argv[])
    3. {
    4.     1.行缓存遇到换行符的时候会刷新缓冲区
    5.      printf("hello world\n");
    6.      while(1);
    7.     
    8.     2程序结束的时候行缓存也会被刷新
    9.      printf("helloworld");
    10.     3.当输入和输出切换的时候也会刷新缓冲区
    11.      int ch;
    12.      printf("helloworld");
    13.      scanf("%d",&ch);
    14.      while(1);
    15.     4.当关闭文件描述符的时候也会刷新缓冲区
    16.      printf("helloworld");
    17.      fclose(stdout);
    18.      while(1);
    19.     5.调用fflush主动刷新缓冲区
    20.      printf("helloworld");
    21.      fflush(stdout);
    22.      while(1);
    23.     6.当缓冲区满也会刷新缓冲区
    24.     int i;
    25.     for(i=0;i<1028;i++){
    26.         fputc('a',stdout);
    27.     }
    28.     while(1);
    29.     return 0;
    30. }

    3.2全缓存的刷新时机:

    1. #include 
    2. int main(int argc,const char * argv[])
    3. {
    4.     FILE *fp;
    5.     if ((fp = fopen("./hello.txt""w")) == NULL)
    6.         PRINT_ERR("fopen error");
    7.     1.换行符不会刷新全缓存
    8.     fprintf(fp,"hello world\n");
    9.      while(1);
    10.     
    11.     2.程序结束的时候全缓存也会被刷新
    12.      fprintf(fp,"hello world");
    13.     3.当输入和输出切换的时候也会刷新全缓冲区
    14.      int ch;
    15.      fprintf(fp,"hello world\n");
    16.      ch = fgetc(fp);
    17.      while(1);
    18.     4.当关闭文件描述符的时候也会刷新全缓冲区
    19.      printf(fp,"hello world\n");
    20.      fclose(fp);
    21.      while(1);
    22.     5.调用fflush主动刷新全缓冲区
    23.      fprintf(fp,"hello world\n");
    24.      fflush(fp);
    25.      while(1);
    26.     6.当缓冲区满也会刷新全缓冲区
    27.     int i;
    28.     for(i=0;i<4097;i++){
    29.         fputc('a',fp);
    30.     }
    31.     while(1);
    32.     return 0;
    33. }
  • 相关阅读:
    怎么禁用笔记本键盘 ,一键式启动关闭。
    码住!听我说护眼台灯这样选!
    SpringCloud Gateway--网关服务基本介绍和基本原理
    HarmonyOS开发:NEXT版本开发新体验
    openStack:学习openStack的前提知识(1)虚拟化以及KVM简介
    QCC51XX---GATT
    2023年度中国开源研究报告
    网络协议--概述
    百度算法题笔试——手撕代码总结
    项目实战第四十六讲:财务经营看板
  • 原文地址:https://blog.csdn.net/a2998658795/article/details/126712349