【C言語】ファイルの末尾に追記して書き込む方法

この記事では、C言語を使ってファイルにデータを追記する方法について学びます。

具体的には、テキストファイルに文字列を追加する方法や、バイナリファイルにデータを書き込む方法を紹介します。

初心者の方でもわかりやすく解説しますので、ぜひ最後まで読んでみてください。

目次から探す

ファイルに追記する

C言語では、ファイルにデータを追記するために、いくつかの関数を使用することができます。

ここでは、fprintffputs、およびfwriteの3つの関数を使った追記方法について詳しく解説します。

fprintf関数を使った追記

fprintf関数は、フォーマット付きでデータをファイルに書き込むための関数です。

ファイルの末尾に追記するには、ファイルを追加モードでオープンする必要があります。

以下は、fprintfを使ってファイルに追記する例です。

#include <stdio.h>
int main() {
    // 追記モードでファイルをオープン
    FILE *file = fopen("example.txt", "a");
    if (file == NULL) {
        perror("ファイルオープンエラー");
        return 1;
    }
    // ファイルに追記
    fprintf(file, "新しい行を追加しました。\n");
    // ファイルをクローズ
    fclose(file);
    return 0;
}

このプログラムでは、example.txtというファイルを追記モードでオープンし、fprintfを使って新しい行を追加しています。

ファイルが正常にオープンできなかった場合は、エラーメッセージを表示します。

fputs関数を使った追記

fputs関数は、文字列をファイルに書き込むためのシンプルな関数です。

こちらも追記モードでファイルをオープンする必要があります。

以下は、fputsを使った追記の例です。

#include <stdio.h>
int main() {
    // 追記モードでファイルをオープン
    FILE *file = fopen("example.txt", "a");
    if (file == NULL) {
        perror("ファイルオープンエラー");
        return 1;
    }
    // ファイルに追記
    fputs("fputsを使って新しい行を追加しました。\n", file);
    // ファイルをクローズ
    fclose(file);
    return 0;
}

このプログラムでは、fputsを使用して文字列をファイルに追加しています。

fprintfと同様に、ファイルが正常にオープンできなかった場合はエラーメッセージを表示します。

fwrite関数を使ったバイナリデータの追記

fwrite関数は、バイナリデータをファイルに書き込むための関数です。

バイナリデータを追記する場合も、ファイルを追加モードでオープンする必要があります。

以下は、fwriteを使ったバイナリデータの追記の例です。

#include <stdio.h>
int main() {
    // 追記モードでバイナリファイルをオープン
    FILE *file = fopen("example.bin", "ab");
    if (file == NULL) {
        perror("ファイルオープンエラー");
        return 1;
    }
    // バイナリデータ
    int data = 12345;
    // バイナリデータをファイルに追記
    fwrite(&data, sizeof(int), 1, file);
    // ファイルをクローズ
    fclose(file);
    return 0;
}

このプログラムでは、example.binというバイナリファイルを追記モードでオープンし、整数データを追記しています。

fwrite関数は、指定したサイズのデータをファイルに書き込むことができます。

これらの方法を使うことで、C言語でファイルにデータを追記することができます。

ファイルのオープン時には、必ずエラーチェックを行い、正常にオープンできたかどうかを確認することが重要です。

エラーハンドリング

ファイル操作を行う際には、エラーハンドリングが非常に重要です。

プログラムが意図した通りに動作しない場合、原因を特定し、適切に対処するためには、エラーを確認する必要があります。

ここでは、C言語におけるファイル操作のエラーハンドリングについて解説します。

fopenのエラーチェック

ファイルを開く際には、fopen関数を使用しますが、ファイルが正常に開けなかった場合には、NULLポインタが返されます。

これを確認することで、ファイルが正しくオープンできたかどうかを判断できます。

以下は、fopenのエラーチェックの例です。

#include <stdio.h>
int main() {
    FILE *file = fopen("example.txt", "a"); // 追記モードでファイルを開く
    if (file == NULL) {
        // fopenが失敗した場合のエラーメッセージ
        perror("ファイルを開くことができませんでした");
        return 1; // エラーコードを返す
    }
    // ファイル操作を行う
    fclose(file); // ファイルを閉じる
    return 0; // 正常終了
}

このコードでは、fopenがNULLを返した場合にperror関数を使ってエラーメッセージを表示しています。

これにより、何が問題だったのかを知ることができます。

書き込みエラーの確認

ファイルにデータを書き込む際にも、エラーが発生する可能性があります。

fprintffputsfwriteなどの書き込み関数は、書き込みが成功したかどうかを確認するために、戻り値をチェックすることが重要です。

以下は、fprintfを使用した書き込みエラーの確認の例です。

#include <stdio.h>
int main() {
    FILE *file = fopen("example.txt", "a");
    if (file == NULL) {
        perror("ファイルを開くことができませんでした");
        return 1;
    }
    // データを書き込む
    if (fprintf(file, "新しい行\n") < 0) {
        // 書き込みが失敗した場合のエラーメッセージ
        perror("ファイルへの書き込みに失敗しました");
        fclose(file); // ファイルを閉じる
        return 1; // エラーコードを返す
    }
    fclose(file); // ファイルを閉じる
    return 0; // 正常終了
}

この例では、fprintfの戻り値をチェックし、書き込みが失敗した場合にはエラーメッセージを表示しています。

ファイルのクローズ

ファイルを使用した後は、必ずfclose関数を使ってファイルを閉じる必要があります。

ファイルを閉じることで、リソースが解放され、データが正しく保存されます。

ファイルを閉じる際にも、エラーチェックを行うことが推奨されます。

以下は、fcloseのエラーチェックの例です。

#include <stdio.h>
int main() {
    FILE *file = fopen("example.txt", "a");
    if (file == NULL) {
        perror("ファイルを開くことができませんでした");
        return 1;
    }
    // データを書き込む
    fprintf(file, "新しい行\n");
    // ファイルを閉じる
    if (fclose(file) != 0) {
        // fcloseが失敗した場合のエラーメッセージ
        perror("ファイルを閉じることができませんでした");
        return 1; // エラーコードを返す
    }
    return 0; // 正常終了
}

このコードでは、fcloseの戻り値をチェックし、ファイルを閉じる際にエラーが発生した場合にはエラーメッセージを表示しています。

これにより、ファイル操作の信頼性を高めることができます。

実際のコード例

簡単な追記プログラム

まずは、ファイルの末尾に簡単なテキストを追記するプログラムを見てみましょう。

このプログラムでは、fprintf関数を使用して、指定したファイルに文字列を追記します。

#include <stdio.h>
int main() {
    // 追記するファイルを開く
    FILE *file = fopen("example.txt", "a"); // "a"モードで開く
    // ファイルが正常に開けたか確認
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // ファイルに追記
    fprintf(file, "これは追記された行です。\n");
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このプログラムを実行すると、example.txtというファイルの末尾に「これは追記された行です。」という行が追加されます。

ファイルが存在しない場合は、新しく作成されます。

複数行の追記プログラム

次に、複数行のテキストをファイルに追記するプログラムを見てみましょう。

ここでは、fputs関数を使用して、複数の行を追記します。

#include <stdio.h>
int main() {
    // 追記するファイルを開く
    FILE *file = fopen("example.txt", "a"); // "a"モードで開く
    // ファイルが正常に開けたか確認
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // 複数行を追記
    fputs("1行目の追記です。\n", file);
    fputs("2行目の追記です。\n", file);
    fputs("3行目の追記です。\n", file);
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このプログラムを実行すると、example.txtの末尾に3行のテキストが追加されます。

各行はfputs関数を使って追記されています。

バイナリデータの追記プログラム

最後に、バイナリデータをファイルに追記するプログラムを見てみましょう。

ここでは、fwrite関数を使用して、整数の配列をバイナリ形式で追記します。

#include <stdio.h>
int main() {
    // 追記するファイルを開く
    FILE *file = fopen("data.bin", "ab"); // "ab"モードで開く
    // ファイルが正常に開けたか確認
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // 追記するデータ
    int numbers[] = {1, 2, 3, 4, 5};
    size_t num_elements = sizeof(numbers) / sizeof(numbers[0]);
    // バイナリデータを追記
    fwrite(numbers, sizeof(int), num_elements, file);
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このプログラムを実行すると、data.binというバイナリファイルに整数の配列が追記されます。

fwrite関数を使用することで、データをバイナリ形式で効率的に書き込むことができます。

これらのプログラムを参考にして、ファイルへの追記を行う際の基本的な方法を理解していただけたと思います。

ファイル操作はプログラミングにおいて非常に重要なスキルですので、ぜひ実際に試してみてください。

目次から探す