c primer plus 第13章13.7.8 把一系列文件中的内容附加在另一个文件的末尾

 

/* 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文件的内容,见下图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值