这一节主要是讲缓冲类型。
根据不同的刷新时间可分为不同的缓冲类型:不缓冲、全缓冲、行缓冲。
标准输出stdout是行缓冲,stderr是不缓冲。普通文件打开都是全缓冲
不缓冲
====================
一旦遇到数据
全缓冲:
=====================
1 填满了缓冲区
2 fflush() 强制刷新
3 fclose()调用fflush()
4 正常退出程序 调用fclose()
5 setbuf()/setvbuf()
行缓冲
=====================
1 填满了缓冲区
3 fclose()调用fflush()
4 正常退出程序 调用fclose()
4 正常退出程序
5 setbuf()/setvbuf()
6 一旦遇到'\n'
程序:
fprintf(stdout, "%s", "abcde");
fprintf(stderr, "%s", "ABCDE");
return 0; //刷型
输出:ABCDEabcde
fprintf(stdout, "%s", "abcde");
fprintf(stderr, "%s", "ABCDE");
pause(); //退出进程但不刷型
输出:ABCDE
fprintf(stdout, "%s\n", "abcde"); //行缓冲会刷型
fprintf(stderr, "%s\n", "ABCDE");
return 0; //刷型
输出:abcdeABCDE
我们还可以利用程序来计算全缓冲区的大小
FILE *fp = fopen("a.txt", "w");
int i;
char msg[] = "0123456789";
for(i=0; i<5000 ;i++)
{
fputc(msg[i%10], fp);
}
pause(); // 暂停
可以查看a.txt里面有几个字节,一般是4096个字节也就是全缓冲区间是4096个字节。然后就刷新了。剩下的904个字节就还在缓冲区中。没有刷新出来,如果把pause()换成return 0;那么就会把5000个字节全部刷新出来。
setvbuf函数用来设定文件流的缓冲区
int setvbuf(FILE * stream, char * buf, int type, unsigned size);
说明:buf为要重新设置的缓冲区首地址,type为缓冲区类型,size为缓冲区内字节的数量
参数类型type说明如下:
- _IOFBF (满缓冲):当缓冲区为空时,从流读入数据。或当缓冲区满时,向流写入数据。
- _IOLBF (行缓冲):每次从流中读入一行数据或向流中写入—行数据。
- _IONBF (无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
程序:
char buf[200];setvbuf(fp, buf, _IOLBF, 200); 设置新的缓冲区200个字节,行缓冲