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
#include
#include
#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
"
,file_app); exit(2); } if(setvbuf(fa,NULL,_IOFBF,BUFSIZE)!=0) { fputs("Can't create output buffer
"
,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
"
,stderr); else if((fs=fopen(file_src,"r"))==NULL) fprintf(stderr,"Can't open%s
"
,file_src); else { if(setvbuf(fs,NULL,_IOFBF,BUFSIZE)!=0){ fputs("Can't create output buffer
"
,stderr); continue; } append(fs,fa); if(ferror(fa)!=0) fprintf(stderr,"Error in reding file %s
"
,file_src); if(ferror(fs)!=0) fprintf(stderr,"Error in writing file %s
"
,file_app); if(fclose(fs)!=0) puts("Error!"); file++; puts("Please next file:"); } } printf("Done,file is %d
"
,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); }