setvbuf()

来源:互联网 发布:网站域名升级访问 编辑:程序博客网 时间:2024/05/29 13:36


为什么要用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语句其实就是用来获取程序返回值的。- 看了几天没整明白文件输入输出是怎么个原理.> 别光看,自己模仿着写写就会理解了。
0 0