setvbuf()



为什么要用setvbuf()建立两个替换缓冲区呢?  

2013-12-26 20:23:49|  分类: c program |  标签: |举报 |字号 订阅

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 1024
#define SLEN 81
void append(FILE *source,FILE *dest);

int main(void)
{
    FILE *fs,*fa;
    int files=0;
    char file_app[SLEN];    //fa 指向追加的目的文件,fs指向源文件
    char file_src[SLEN];    //源文件的名称
    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 (empty line to quit):");
    while(gets (file_src)&&file_src[0]!='\0')
    {
        if(strcmp(file_src,file_app)==0)
            fputs("Can't apend 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 input buffer\n",stderr);
                continue;
            }
            append(fs,fa);
            if(ferror (fs) !=0)
                fprintf(stderr,"Error in reading file %s.\n",file_src);
            if(ferror (fa) !=0)
                fprintf(stderr,"Error in writing file %s\n",file_app);
            fclose(fs);
            files++;
            printf("Flle %s appended.\n",file_src);
            puts("Next file (empty line to quit):");
        }
    }
    printf("Done. %d files appended.\n",files);
    fclose(fa);
    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);
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 为什么要用setvbuf()建立两个替换缓冲区呢?不是说fopen()打开文件的时候会建议一个缓冲区么?
> 的确,fopen会创建一个默认的缓冲区。默认缓冲区的大小跟操作系统和文件系统都有关。

- 为什么还要在用到替换缓冲区?
> 一般情况下不需要自己设置缓冲区大小,除非两种情况:1,在有限内存的嵌入式系统里,希望精确控制内存使用量。2,希望使用比默认值更大的缓冲区来换取更高的IO性能。你这个程序如果用在windows系统上,使用这么小的替换缓冲区(1024就是1K)其实没有任何意义。因为现在的PC机内存恐怕很少有1G以下的,以牺牲性能的代价去节约那么几十K的内存,得不偿失。

- exit(2) exit(3)之类的貌似没用啊.
> exit(2)的效果相当于让main函数return 2。这个返回值不会显示在屏幕上,但是会被操作系统获得。一般返回0表示没有错误。如果你了解DOS批处理的话,errorlevel语句其实就是用来获取程序返回值的。

- 看了几天没整明白文件输入输出是怎么个原理.
> 别光看,自己模仿着写写就会理解了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值