在C语言中,合并两个文件的内容可以通过读取两个文件的内容,然后将它们写入一个新的文件来实现。以下是一个示例程序,演示如何合并两个文件的内容。
示例代码
#include
#include
int main() {
FILE *file1, *file2, *mergedFile;
char ch;
// 打开第一个文件
file1 = fopen("file1.txt", "r");
if (file1 == NULL) {
perror("无法打开 file1.txt");
return EXIT_FAILURE;
}
// 打开第二个文件
file2 = fopen("file2.txt", "r");
if (file2 == NULL) {
perror("无法打开 file2.txt");
fclose(file1);
return EXIT_FAILURE;
}
// 打开或创建合并后的文件
mergedFile = fopen("mergedFile.txt", "w");
if (mergedFile == NULL) {
perror("无法创建 mergedFile.txt");
fclose(file1);
fclose(file2);
return EXIT_FAILURE;
}
// 将第一个文件的内容写入合并后的文件
while ((ch = fgetc(file1)) != EOF) {
fputc(ch, mergedFile);
}
// 将第二个文件的内容写入合并后的文件
while ((ch = fgetc(file2)) != EOF) {
fputc(ch, mergedFile);
}
// 关闭所有文件
fclose(file1);
fclose(file2);
fclose(mergedFile);
printf("文件合并成功!合并后的内容已写入 mergedFile.txt\n");
return 0;
}
代码说明
- 文件指针
- file1 和 file2 分别指向两个输入文件。
- mergedFile 指向合并后的输出文件。
- 文件打开与检查
- 使用 fopen 打开文件,并检查是否成功打开。
- 如果文件打开失败,输出错误信息并退出程序。
- 文件内容复制
- 使用 fgetc 逐个字符读取文件内容。
- 使用 fputc 将读取的字符写入合并后的文件。
- 文件关闭
- 使用 fclose 关闭所有打开的文件。
- 输出结果
- 合并后的内容写入 mergedFile.txt。
示例运行
文件 file1.txt 内容:
Hello, World!
This is file1.
文件 file2.txt 内容:
This is file2.
Goodbye!
合并后的文件 mergedFile.txt 内容:
Hello, World!
This is file1.
This is file2.
Goodbye!
注意事项
- 文件路径
- 如果文件不在当前目录下,需要提供文件的完整路径。
- 文件大小
- 该程序逐字符读取文件,适合处理较小的文件。如果需要处理大文件,可以考虑使用缓冲区(如 fread 和 fwrite)来提高效率。
- 文件覆盖
- 如果 mergedFile.txt 已经存在,fopen 会覆盖其内容。如果需要追加内容,可以使用 "a" 模式打开文件。
扩展:支持动态文件名
- 以下是一个扩展版本,支持用户输入文件名:
#include
#include
int main() {
FILE *file1, *file2, *mergedFile;
char ch;
char filename1[100], filename2[100], mergedFilename[100];
// 提示用户输入文件名
printf("请输入第一个文件名: ");
scanf("%s", filename1);
printf("请输入第二个文件名: ");
scanf("%s", filename2);
printf("请输入合并后的文件名: ");
scanf("%s", mergedFilename);
// 打开第一个文件
file1 = fopen(filename1, "r");
if (file1 == NULL) {
perror("无法打开第一个文件");
return EXIT_FAILURE;
}
// 打开第二个文件
file2 = fopen(filename2, "r");
if (file2 == NULL) {
perror("无法打开第二个文件");
fclose(file1);
return EXIT_FAILURE;
}
// 打开或创建合并后的文件
mergedFile = fopen(mergedFilename, "w");
if (mergedFile == NULL) {
perror("无法创建合并后的文件");
fclose(file1);
fclose(file2);
return EXIT_FAILURE;
}
// 将第一个文件的内容写入合并后的文件
while ((ch = fgetc(file1)) != EOF) {
fputc(ch, mergedFile);
}
// 将第二个文件的内容写入合并后的文件
while ((ch = fgetc(file2)) != EOF) {
fputc(ch, mergedFile);
}
// 关闭所有文件
fclose(file1);
fclose(file2);
fclose(mergedFile);
printf("文件合并成功!合并后的内容已写入 %s\n", mergedFilename);
return 0;
}
改进点:
- 动态文件名
- 用户可以通过输入指定文件名。
- 灵活性
- 支持任意文件名和路径。
扩展:使用缓冲区提高效率
- 以下是一个使用缓冲区(fread 和 fwrite)的版本,适合处理大文件:
#include
#include
#define BUFFER_SIZE 1024
int main() {
FILE *file1, *file2, *mergedFile;
char buffer[BUFFER_SIZE];
size_t bytesRead;
// 打开第一个文件
file1 = fopen("file1.txt", "rb");
if (file1 == NULL) {
perror("无法打开 file1.txt");
return EXIT_FAILURE;
}
// 打开第二个文件
file2 = fopen("file2.txt", "rb");
if (file2 == NULL) {
perror("无法打开 file2.txt");
fclose(file1);
return EXIT_FAILURE;
}
// 打开或创建合并后的文件
mergedFile = fopen("mergedFile.txt", "wb");
if (mergedFile == NULL) {
perror("无法创建 mergedFile.txt");
fclose(file1);
fclose(file2);
return EXIT_FAILURE;
}
// 将第一个文件的内容写入合并后的文件
while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, file1)) > 0) {
fwrite(buffer, 1, bytesRead, mergedFile);
}
// 将第二个文件的内容写入合并后的文件
while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, file2)) > 0) {
fwrite(buffer, 1, bytesRead, mergedFile);
}
// 关闭所有文件
fclose(file1);
fclose(file2);
fclose(mergedFile);
printf("文件合并成功!合并后的内容已写入 mergedFile.txt\n");
return 0;
}
改进点:
- 缓冲区
- 使用 fread 和 fwrite 以块为单位读写文件,提高效率。
- 二进制模式
- 使用 "rb" 和 "wb" 模式打开文件,适用于所有类型的文件。
通过以上方法,可以灵活地合并两个文件的内容,并根据需求选择适合的实现方式。