setvbuf()创建缓冲区函数

原型: 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值