设置文件缓冲区函数
void setbuf(FILE *stream,char *buf);
void setvbuf(FILE *stream,char *buf,int type,unsigned size);
这两个函数将使得打开文件后,用户可建立自己的文件缓冲区,而不使用fopen()函数打开文件设定的默认缓冲区。
对于setbuf()函数,buf指出的缓冲区长度由头文件stdio.h中定义的宏BUFSIZE的值决定,缺省值为512字节。当选定buf为空时,setbuf函数将使的文件I/O不带缓冲。而对setvbuf函数,则由malloc函数来分配缓冲区。参数size指明了缓冲区的长度(必须大于0),而参数type则表示了缓冲的类型,其值可以取如下值:
type 值 含义
_IOFBF 文件全部缓冲,即缓冲区装满后,才能对文件读写
_IOLBF 文件行缓冲,即缓冲区接收到一个换行符时,才能对文件读写
_IONBF 文件不缓冲,此时忽略buf,size的值,直接读写文件,不再经过文件缓冲区缓冲
/* * By : xiaolong * Date: 7,March * Fuction: check the buf of the I\O operation! * * * */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> int main(int argc,char **argv) { FILE *fp; char msg1[]="Hello,world\n"; char msg2[]="Hello\nworld"; char buf[128]; if((fp=fopen("buf1.txt","w"))==NULL) { printf("fail to open the buf1.txt!\n"); perror("Open error"); return -1; } memset(buf,'\0',128); setbuf(fp,NULL); fwrite(msg1,7,1,fp); printf("Test setbuf(no buf)!\n"); printf("Now buf data is :buf =%s\n",buf); getchar(); fclose(fp); //打开一个文件,然后设置为nobuf情况,并检查关闭前流的情况 if((fp=fopen("buf2.txt","w"))==NULL) { printf("Fail to open the buf2.txt!\n"); perror("Open error"); return -1; } memset(buf,'\0',128); setvbuf(fp,NULL,_IONBF,0); fwrite(msg1,7,1,fp); printf("Test setbuf(no buf)!\n"); printf("Now buf data is :buf = %s\n",buf); getchar(); fclose(fp); //打开一个文件,然后设置为line buf情况,并肩查关闭流前的情况 if((fp=fopen("buf3.txt","w"))==NULL) { printf("Fail to open the buf3.txt!\n"); perror("Open error"); return -1; } memset(buf,'\0',128); setvbuf(fp,buf,_IOLBF,sizeof(buf)); fwrite(msg2,sizeof(msg2),1,fp); printf("Test setbuf(line buf)!\n"); printf("Now buf data is :buf=%s\n",buf); getchar(); fclose(fp); //打开一个文件,然后设置为full buf情况,并检查关闭流前的情况 if((fp=fopen("buf4.txt","w"))==NULL) { printf("Fail to open the buf4.txt!\n"); perror("Open fail"); return -1; } memset(buf,'\0',128); setvbuf(fp,buf,_IOFBF,sizeof(buf)); fwrite(msg2,sizeof(msg2),1,fp); printf("Test setbuf(full buf)!\n"); printf("Now buf data is :buf =%s\n",buf); getchar(); fclose(fp); return 0; }
对于前两种情况:不用按回车键,msg1的内容就会被写进目标文件当中(根据设置的写入大小,写入相应的数量)而对于第三种:行缓冲(一般设置为128个字节,这里假设设置的为N个字节,缓冲会在先写入缓冲后,再写入文件!而只有当缓冲读到N-1个字节,或者遇到回车符,或者结束符,才会将缓冲区的内容写入文件,而不会等到调用fclose(fp)函数,在关闭文件流前写入文件!)
对于第四种:全缓冲(会将所有内容先写入缓存,等所有内容写完后,经过调用fclose(fp),刷新了缓冲区,将缓冲区内容写入文件!)