文件IO编程十一

这一节主要是讲缓冲类型。

根据不同的刷新时间可分为不同的缓冲类型:不缓冲、全缓冲、行缓冲。

标准输出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 (无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
setbuf()和setvbuf()函数的实际意义在于:用户打开一个文件后,可以建立自己的文件缓冲区,而不必使用fopen()函数打开文件时设定的默认缓冲区。这样就可以让用户自己来控制缓冲区,包括改变缓冲区大小、定时刷新缓冲区、改变缓冲区类型、删除流中默认的缓冲区、为不带缓冲区的流开辟缓冲区等。

程序:

char buf[200];
setvbuf(fp, buf, _IOLBF, 200);  设置新的缓冲区200个字节,行缓冲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值