行缓存: 和终端相关的缓冲区,stdin stdout
全缓存: 和文件相关的缓冲区 fopen
不缓存,没有缓冲区,stderr;
缓冲区大小
行缓存1k
int main(int argc, const char *argv[])
{
int ch;
scanf("%d",&ch);
printf("size = %ld\n",stdin->_IO_buf_end - stdin->_IO_buf_base);
printf("size = %ld\n",stdout->_IO_buf_end - stdout->_IO_buf_base);
fprintf(stderr,"asiajigijasg\n");
printf("size = %ld\n",stderr->_IO_buf_end - stderr->_IO_buf_base);
return 0;
}
行缓存缓冲区刷新机制
int main(int argc, const char *argv[])
{
//1.行缓存遇到换行符的时候会刷新缓冲区
2.程序结束的时候行缓存也会被刷新
printf("asihdashd\n");
while(1);
//3.当输入和输出切换的时候也会刷新缓存区
int ch;
printf("helloworld");
scanf("%d",&ch);
while(1);
//4.关闭文件描述符的时候也会刷新
printf("helloworld");
fclose(stdout);
while(1);
//5.主动刷新
printf("helloworld");
fflush(stdout);
while(1);
return 0;
//6.当缓冲区满会刷新
int i;
for (i = 0; i<1025;i++){
fputc('a',stdout);
}
while(1);
}
全缓存刷新机制
int main(int argc, const char *argv[])
{
FILE *fp;
int i = 0;
if((fp = fopen("hello.txt","a+")) == NULL)
PRINT_ERR("fopen_error");
//缓冲区满刷新
for(i = 0; i <5000;i++){
fputc('a',fp);
}
while(1);
//关闭文件刷新
fputc('a',fp);
fclose(fp);
while(1);
//强制刷新
fputc('a',fp);
fflush(fp);
while(1);
//输入输出切换刷新
int in = 0;
fputc('a',fp);
fgetc(fp);
while(1);
}