概述
一.标准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 = %ldn", stdin->_IO_buf_end - stdin->_IO_read_base);
1024
printf("size = %ldn", stdout->_IO_buf_end - stdout->_IO_read_base);
1024
fprintf(stderr,"q121231qweqweqweqweqweqweqwe2");
printf("size = %ldn", 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 = %ldn",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 worldn");
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 worldn");
while(1);
2.程序结束的时候全缓存也会被刷新
fprintf(fp,"hello world");
3.当输入和输出切换的时候也会刷新全缓冲区
int ch;
fprintf(fp,"hello worldn");
ch = fgetc(fp);
while(1);
4.当关闭文件描述符的时候也会刷新全缓冲区
printf(fp,"hello worldn");
fclose(fp);
while(1);
5.调用fflush主动刷新全缓冲区
fprintf(fp,"hello worldn");
fflush(fp);
while(1);
6.当缓冲区满也会刷新全缓冲区
int i;
for(i=0;i<4097;i++){
fputc('a',fp);
}
while(1);
return 0;
}
最后
以上就是高贵大雁为你收集整理的行缓冲,全缓冲,无缓冲的详细介绍一.标准IO缓冲区的全部内容,希望文章能够帮你解决行缓冲,全缓冲,无缓冲的详细介绍一.标准IO缓冲区所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复