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