/* append.c --把文件附加到另一个文件末尾 */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define BUFSIZE 4096 // 定义4096字节的缓冲区
#define SLEN 81
void append(FILE *source, FILE *dest); //声明文件附加的函数
char *s_gets(char *st,int n);
int main(void)
{
FILE *fa, *fs; //fa指向目标文件,fs指向源文件
int files = 0; //附加的文件数量
char file_app[SLEN]; //目标文件名
char file_src[SLEN]; //源文件名
int ch;
puts("Enter name of destination file:");
s_gets(file_app,SLEN); //输入目标文件的名字
if((fa=fopen(file_app,"a+")) ==NULL)
{
fprintf(stderr,"Can't open %s\n",file_app);
exit(EXIT_FAILURE);
}
if(setvbuf(fa,NULL,_IOFBF,BUFSIZE) !=0) //创建4096字节的输出缓冲区
{
fputs("Can't create output buffer\n",stderr); //创建输出缓冲区失败
exit(EXIT_FAILURE);
}
puts("Enter name of first source file (empty line to quit):");
while(s_gets(file_src,SLEN) && file_src[0] !='\0') //输入源文件名
{
if(strcmp(file_src,file_app) ==0) //目标文件与源文件内容相同,则返回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) //创建4096字节的输入缓冲区
{
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 reading file %s.\n",file_app);
fclose(fs); //关闭源文件
files++; //附加的文件数
printf("File %s appended.\n",file_src);
puts("Next file (empty line to quit):");
}
}
printf("Done appending. %d files appended.\n",files); //附加结束
rewind(fa); //文件指针回到文件的起始处
printf("%s contents:\n",file_app);
while((ch = getc(fa)) !=EOF)
putchar(ch);
puts("Done displaying.");
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) //源文件内容读入temp数组,返回的字节数>0
fwrite(temp,sizeof(char),bytes,dest); //数组内容再写入目标文件,大小是bytes
}
char *s_gets(char *st,int n)
{
char *ret_val;
char *find;
ret_val=fgets(st,n,stdin);
if(ret_val)
{
find = strchr(st,'\n'); //查找换行符
if(find) //如果地址 find 不是NULL
*find='\0';
else
while(getchar() !='\n')
continue;
}
return ret_val;
}
运行程序,见下图
qqk文件和qqL文件中的内容,附加到qqa文件中内容的末尾
附加结束后,qqa文件的内容,见下图