C言語

【C言語】第7章第9回:複数ファイルを扱うプログラム例

複数のファイルを同時に操作する方法を学ぶことで、効率的なデータ処理が可能になります。本記事では、C言語を使用して複数のファイルを扱う基本と応用例を解説します。

0. 記事の概要

この記事を読むメリット

  • 効率的なファイル操作:複数のファイルを同時に操作する方法を学べます。
  • 応用力の向上:プロジェクトに必要な複雑なデータ処理を実現できます。
  • 実践的な知識:複数のデータソースを扱う際のスキルを習得できます。

この記事で学べること

  • 複数のファイルを開く基本操作
  • 複数のファイルを使った応用プログラム
  • エラー処理を含むプログラム例

活用のイメージ

例えば、ログファイルを解析したり、データを複数のファイルに分割して保存したりする場合に役立つ知識を学びます。

1. 複数のファイルを操作する基本

1.1 複数ファイルを開く方法

複数のファイルを同時に開くには、FILE型のファイルポインタを複数使用します。

#include <stdio.h>

int main() {
    FILE *file1 = fopen("file1.txt", "r");
    FILE *file2 = fopen("file2.txt", "r");

    if (file1 == NULL || file2 == NULL) {
        printf("Error opening files.\n");
        return 1;
    }

    // ファイル操作

    fclose(file1);
    fclose(file2);
    return 0;
}
動作解説
  1. 複数のファイルを開く:fopen()でそれぞれのファイルを開きます。
  2. エラー処理:どちらか一方のファイルが開けない場合はエラーを表示します。
  3. ファイルのクローズ:fclose()ですべてのファイルを閉じます。

1.2 複数ファイルを使ったデータ処理

複数のファイルからデータを読み取り、別のファイルに書き込むプログラムを以下に示します。

#include <stdio.h>

int main() {
    FILE *file1 = fopen("input1.txt", "r");
    FILE *file2 = fopen("input2.txt", "r");
    FILE *output = fopen("output.txt", "w");

    if (file1 == NULL || file2 == NULL || output == NULL) {
        printf("Error opening files.\n");
        return 1;
    }

    char buffer[100];

    // ファイル1の内容を出力ファイルにコピー
    while (fgets(buffer, sizeof(buffer), file1) != NULL) {
        fprintf(output, "%s", buffer);
    }

    // ファイル2の内容を出力ファイルにコピー
    while (fgets(buffer, sizeof(buffer), file2) != NULL) {
        fprintf(output, "%s", buffer);
    }

    fclose(file1);
    fclose(file2);
    fclose(output);
    printf("Data combined into output.txt\n");
    return 0;
}
動作解説
  1. ファイルのオープン:fopen()で入力ファイルと出力ファイルを開きます。
  2. データの読み取りと書き込み:fgets()でデータを読み取り、fprintf()で書き込みます。
  3. ファイルのクローズ:すべてのファイルを閉じます。

2. 複数ファイルを使った応用例

2.1 ログファイルの統合

複数のログファイルを統合するプログラムの例を示します。

#include <stdio.h>

int main() {
    FILE *log1 = fopen("log1.txt", "r");
    FILE *log2 = fopen("log2.txt", "r");
    FILE *combinedLog = fopen("combined_log.txt", "w");

    if (log1 == NULL || log2 == NULL || combinedLog == NULL) {
        printf("Error opening files.\n");
        return 1;
    }

    char buffer[256];

    // ログ1の内容を統合ログに追加
    while (fgets(buffer, sizeof(buffer), log1) != NULL) {
        fprintf(combinedLog, "%s", buffer);
    }

    // ログ2の内容を統合ログに追加
    while (fgets(buffer, sizeof(buffer), log2) != NULL) {
        fprintf(combinedLog, "%s", buffer);
    }

    fclose(log1);
    fclose(log2);
    fclose(combinedLog);
    printf("Logs combined into combined_log.txt\n");
    return 0;
}
ポイント
  • 複数の入力ファイルを1つの出力ファイルにまとめる
  • エラー処理で全ファイルが正常に開けたかを確認する

2.2 ファイル内容の比較

2つのファイルの内容が同じかどうかを比較するプログラムです。

#include <stdio.h>
#include <string.h>

int main() {
    FILE *file1 = fopen("file1.txt", "r");
    FILE *file2 = fopen("file2.txt", "r");

    if (file1 == NULL || file2 == NULL) {
        printf("Error opening files.\n");
        return 1;
    }

    char buffer1[256], buffer2[256];
    int line = 1;

    while (fgets(buffer1, sizeof(buffer1), file1) != NULL && fgets(buffer2, sizeof(buffer2), file2) != NULL) {
        if (strcmp(buffer1, buffer2) != 0) {
            printf("Difference found on line %d\n", line);
            fclose(file1);
            fclose(file2);
            return 0;
        }
        line++;
    }

    printf("Files are identical.\n");
    fclose(file1);
    fclose(file2);
    return 0;
}
ポイント
  • 各行を比較し、違いが見つかった場合に出力
  • ファイルが同じ内容である場合に適切に通知

3. 練習問題

以下の課題に挑戦して、複数ファイル操作のスキルを向上させましょう。

  1. 複数のファイルを読み取り、それぞれの内容を別のファイルに保存するプログラムを作成してください。
  2. 複数のファイルからデータを読み取り、共通する行だけを別のファイルに保存するプログラムを作成してください。
  3. 複数のファイルを開き、最も大きな数値を探すプログラムを作成してください。

4. 練習問題の解答と解説

問3の解答

#include <stdio.h>

int main() {
    FILE *file1 = fopen("numbers1.txt", "r");
    FILE *file2 = fopen("numbers2.txt", "r");

    if (file1 == NULL || file2 == NULL) {
        printf("Error opening files.\n");
        return 1;
    }

    int num, max = 0;

    // ファイル1を読み取る
    while (fscanf(file1, "%d", &num) == 1) {
        if (num > max) {
            max = num;
        }
    }

    // ファイル2を読み取る
    while (fscanf(file2, "%d", &num) == 1) {
        if (num > max) {
            max = num;
        }
    }

    fclose(file1);
    fclose(file2);
    printf("Largest number is: %d\n", max);
    return 0;
}

5. まとめ

複数ファイルを操作するスキルは、効率的なデータ管理に不可欠です。本記事では、基本操作から応用例までを学びました。次回は、複数ファイル操作の応用例についてさらに詳しく解説します。