代码
#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文件里查看,也有拼接进去