行缓存:和终端相关的缓冲区就是行缓存 stdin stdout
全缓存: 和文件相关的就是全缓存 fopen打开的文件
不缓存:没有缓冲区 stderr
- #include
-
- 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;
- }
- #include
-
- 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;
- }
为0
- #include
-
- 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;
- }
- #include
-
- 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;
- }