您的位置:首页 > 编程语言 > VB

setvbuf()创建缓冲区函数

2016-05-24 17:24 435 查看
原型: setvbuf(FILE * restrict fp,char *restrict buf,int mode,size_t size);

if(setvbuf(fp,NULL,_IOFBF,BUFSIZE)!=0)
puts("Error!");


函数建立了一个供 标准 I/O函数使用的替换缓冲区,打开文件后,在没有进行任何操作前,可以调用这个函数.由指针fp来指定流,buf指向将使用的存储区.如果buf的值不是NULL就必须创建这个缓冲区size为数组的大小,mode将选取:_IOFBF(完全缓冲)等… 参考资料 如果执行成功,函数会返回零值,否则返回一个非零值.

用户打开一个文件后,可以建立自己的文件缓冲区,而不必使用fopen()函数打开文件时设定的默认缓冲区。这样就可以让用户自己来控制缓冲区,包括改变缓冲区大小、定时刷新缓冲区、改变缓冲区类型、删除流中默认的缓冲区、为不带缓冲区的流开辟缓冲区等。

示例代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUFSIZE 1024
#define SIZE 81
void append(FILE *source,FILE *dest);
int main(void)
{
FILE *fa,*fs;
int file=0;
char file_src[SIZE];
char file_app[SIZE];
puts("Enter name of destination file:");
gets(file_app);
if((fa=fopen(file_app,"a"))==NULL)
{
fprintf(stderr,"Can't open %s\n",file_app);
exit(2);
}
if(setvbuf(fa,NULL,_IOFBF,BUFSIZE)!=0)
{
fputs("Can't create output buffer\n",stderr);
exit(3);
}
puts("Enter name of first source file:");
while(gets(file_src)!=NULL && file_src[0]!='\0')
{
if(strcmp(file_src,file_app)==0)
fputs("Can't append file to itself\n",stderr);
else if((fs=fopen(file_src,"r"))==NULL)
fprintf(stderr,"Can't open%s\n",file_src);
else
{
if(setvbuf(fs,NULL,_IOFBF,BUFSIZE)!=0){
fputs("Can't create output buffer\n",stderr);
continue;
}
append(fs,fa);
if(ferror(fa)!=0)
fprintf(stderr,"Error in reding file %s\n",file_src);
if(ferror(fs)!=0)
fprintf(stderr,"Error in writing file %s\n",file_app);
if(fclose(fs)!=0)
puts("Error!");
file++;
puts("Please next file:");
}
}
printf("Done,file is %d\n",file);
if(fclose(fa)!=0)
puts("Fa file close error!");
return 0;
}
void append(FILE *source,FILE *dest)
{
size_t bytes;
static char temp[BUFSIZE];
while((bytes=fread(temp,sizeof(char),BUFSIZE,source))>0)
fwrite(temp,sizeof(char),bytes,dest);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: