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


    一.标准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. }
  • 相关阅读:
    Redis内存策略
    Java多线程秘籍,掌握这5种方法,让你的代码优化升级
    数据挖掘学习——支持向量机(SVM)
    Go 1.22 中的 for 循环新特性详解
    论文写作:word连续交叉引用
    动手学习TCP中
    U盘装CentOS 7 遇到的问题
    【Pytorch深度学习开发实践学习】Pytorch实现LeNet神经网络(3)predict.py
    【以太网通信】MDIO 管理接口及控制器设计
    JAVA毕业设计146—基于Java+Springboot+vue+uniapp的景区旅游购票小程序(源代码+数据库+9000字论文)
  • 原文地址:https://blog.csdn.net/a2998658795/article/details/126712349