把一系列文件中的内容附加在另一个文件的末尾(询问目标文件名称并打开、使用循环询问源文件、用读模式以此打开每个源文件并将其添加到目标文件的末尾)

代码

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h> //为 malloc()\free() 、exit()提供原型
#include<string.h>
#define LEN 100
#define BUFSIZE 4096

char *s_gets(char *st, int n);
void append(FILE *source, FILE *dest);//拷贝函数 :文件来源 、文件去处

int main(void)
{

	FILE *fa, *fs; //fa指向目标文件、fs指向源文件

	int files = 0;//附加文件数量
	char file_app[LEN]; //目标文件名
	char file_src[LEN]; //源文件名(正在处理的文件名)

	int ch;

	puts("请输入目标文件名:");
	s_gets(file_app, LEN);
	if ((fa = fopen(file_app, "a+")) == NULL)
	{
		fprintf(stderr, "usage: %s filename.\n", file_app);
		exit(EXIT_FAILURE);
	}
	 
	//人为分配缓冲区
	if (setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0)
	{
		 //函数自己分配的缓冲区不为0,错误
		 //因为第二个参数buf指向待使用的缓冲区,且值为空,因此会自己分配
		 //操作成功 返回0

		fputs("can't create output file.\n", stderr);
		 //向目标文件输出
		exit(EXIT_FAILURE);
	}

	puts("请输入第一个源文件名:");
	while (s_gets(file_src, LEN) && file_src[0] != '\0')
	{
		//开始捕获输入,先判断
		if (strcmp(file_src, file_app) == 0)
		{
			//该文件与源文件相同,跳至下一个文件
			//防止程序把文件附加在自己的末尾~~
			fputs("can't append file to itself.\n", stderr);
		}
		else if ((fs = fopen(file_src, "r")) == NULL)
		{
			//读模式无法打开源文件
			fprintf(stderr, "can't open %s file\n", file_src);
		}
		else
		{
			if (setvbuf(fs, NULL, _IOFBF, BUFSIZE) != 0)
			{
				//函数自己分配的缓冲区若还是失败
				//源文件
				fputs("can't create input file.\n", stderr);
				continue;
			}
			//一切🆗,开始追加,来源向目标拷贝
			append(fs,fa);
			if (ferror(fs) != 0)
			{ 
				//读写出现错误,返回非0值
				fprintf(stderr, "error reading file %s\n", file_src);
			}
			if (ferror(fa) != 0)
			{
				fprintf(stderr, "error writinging file %s\n", file_src);
			}

			//拷贝完成,关闭源文件
			fclose(fs);
			//一共追加了多少个文件统计
			files++;
			printf("file %s appened.\n", file_src);//源文件已经追加过
			puts("next file");

		}


	}

	printf("done appending. %d files append.\n", files);
	rewind(fa);
	printf("%s contents.", file_app);


	//从文件指针fa指向的文件中获取字符
	while ((ch = getc(fa)) != EOF)
	{
		putchar(ch);
	}
	puts("done displaying");
	fclose(fa);


	return 0;
}


//一次拷贝4096个字节,而不是一次拷贝1字节
void append(FILE*source, FILE *dest)
{
	size_t bytes;//返回字节数

	static char temp[BUFSIZE];//只分配一次
	while ((bytes = fread(temp, sizeof(char), BUFSIZE, source)) > 0) 
	{
		//读取成功 :将文件指针 source 指定的待读取文件中的 BUFSIZE 个 char 大小的值,拷贝进temp数组中
		//返回成功读取项的数量,就是 BUFSIZE

		fwrite(temp,sizeof(char), bytes, dest);
		//把 bytes 快 char 大小字节的数据从temp 写入 dest 指定的文件中
	}




}

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 = '\0';
		}
		else
		{
			while (getchar() != '\n')
			{
				continue;
			}
		}

	}

	return ret_val;
}

图片

在这里插入图片描述
如果是中文字符,可以到2.txt文件里查看,也有拼接进去
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值