C语言实战之文件合并

在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;
}

代码说明

  1. 文件指针
  • file1 和 file2 分别指向两个输入文件。
  • mergedFile 指向合并后的输出文件。
  1. 文件打开与检查
  • 使用 fopen 打开文件,并检查是否成功打开。
  • 如果文件打开失败,输出错误信息并退出程序。
  1. 文件内容复制
  • 使用 fgetc 逐个字符读取文件内容。
  • 使用 fputc 将读取的字符写入合并后的文件。
  1. 文件关闭
  • 使用 fclose 关闭所有打开的文件。
  1. 输出结果
  • 合并后的内容写入 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!

注意事项

  1. 文件路径
  • 如果文件不在当前目录下,需要提供文件的完整路径。
  1. 文件大小
  • 该程序逐字符读取文件,适合处理较小的文件。如果需要处理大文件,可以考虑使用缓冲区(如 fread 和 fwrite)来提高效率。
  1. 文件覆盖
  • 如果 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;
}

改进点:

  1. 动态文件名
  • 用户可以通过输入指定文件名。
  1. 灵活性
  • 支持任意文件名和路径。

扩展:使用缓冲区提高效率

  • 以下是一个使用缓冲区(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;
}

改进点:

  1. 缓冲区
  • 使用 fread 和 fwrite 以块为单位读写文件,提高效率。
  1. 二进制模式
  • 使用 "rb" 和 "wb" 模式打开文件,适用于所有类型的文件。

通过以上方法,可以灵活地合并两个文件的内容,并根据需求选择适合的实现方式。