【C言語】ファイルに文字列や数値を1行ずつ書き込む方法

この記事では、C言語を使ってファイルに文字列や数値を書き込む方法について学びます。

具体的には、文字列や数値をファイルに保存するための関数の使い方や、エラーチェックの重要性、さらにユーザーからの入力をファイルに書き込む方法についても解説します。

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

目次から探す

文字列の書き込み

C言語では、ファイルに文字列を保存することができます。

これにより、プログラムの実行結果を後で確認したり、データを永続的に保存したりすることが可能です。

ここでは、文字列をファイルに書き込む方法について詳しく解説します。

文字列をファイルに書き込む方法

ファイルに文字列を書き込むためには、主に2つの関数を使用します。

それはfprintf関数fputs関数です。

それぞれの使い方を見ていきましょう。

fprintf関数の使用

fprintf関数は、フォーマット指定子を使って文字列をファイルに書き込むことができる関数です。

書き込みたい内容をフォーマットに従って指定することができるため、数値や文字列を混在させて書き込む際に便利です。

#include <stdio.h>
int main() {
    FILE *file = fopen("output.txt", "w"); // 書き込み用にファイルをオープン
    if (file == NULL) {
        perror("ファイルオープンエラー");
        return 1;
    }
    int number = 42;
    fprintf(file, "数値: %d\n", number); // 整数をファイルに書き込む
    fprintf(file, "こんにちは、世界!\n"); // 文字列をファイルに書き込む
    fclose(file); // ファイルをクローズ
    return 0;
}

このコードでは、output.txtというファイルに整数と文字列をそれぞれ書き込んでいます。

fputs関数の使用

fputs関数は、指定した文字列をそのままファイルに書き込むための関数です。

フォーマット指定子は必要なく、シンプルに文字列をファイルに追加することができます。

#include <stdio.h>
int main() {
    FILE *file = fopen("output.txt", "a"); // 追記用にファイルをオープン
    if (file == NULL) {
        perror("ファイルオープンエラー");
        return 1;
    }
    fputs("これはfputsを使った書き込みです。\n", file); // 文字列をファイルに書き込む
    fclose(file); // ファイルをクローズ
    return 0;
}

この例では、output.txtに新しい行を追加しています。

aモードでオープンすることで、既存の内容を保持しつつ新しいデータを追加できます。

書き込み例

上記のコードを実行すると、output.txtファイルには以下の内容が書き込まれます。

数値: 42
こんにちは、世界!
これはfputsを使った書き込みです。

このように、fprintffputsを使うことで、簡単にファイルに文字列や数値を書き込むことができます。

文字列を1行ずつ書き込むサンプルコード

次に、複数の文字列を1行ずつファイルに書き込むサンプルコードを示します。

#include <stdio.h>
int main() {
    FILE *file = fopen("output.txt", "w"); // 書き込み用にファイルをオープン
    if (file == NULL) {
        perror("ファイルオープンエラー");
        return 1;
    }
    const char *lines[] = {
        "1行目の文字列です。",
        "2行目の文字列です。",
        "3行目の文字列です。"
    };
    for (int i = 0; i < 3; i++) {
        fputs(lines[i], file); // 各行をファイルに書き込む
        fputs("\n", file); // 改行を追加
    }
    fclose(file); // ファイルをクローズ
    return 0;
}

このコードを実行すると、output.txtには以下の内容が書き込まれます。

1行目の文字列です。
2行目の文字列です。
3行目の文字列です。

エラーチェックの重要性

ファイル操作を行う際には、エラーチェックが非常に重要です。

ファイルが正しくオープンできなかった場合や、書き込みに失敗した場合には、プログラムが予期しない動作をする可能性があります。

上記のコード例では、fopen関数の戻り値を確認し、ファイルが正常にオープンできたかどうかをチェックしています。

エラーチェックを行うことで、プログラムの信頼性を高め、デバッグを容易にすることができます。

ファイル操作を行う際は、必ずエラーチェックを行うようにしましょう。

数値の書き込み

数値をファイルに書き込む方法について解説します。

C言語では、数値をファイルに書き込むために主にfprintf関数を使用します。

この関数は、フォーマット指定子を使って数値を文字列としてファイルに出力することができます。

数値をファイルに書き込む方法

数値をファイルに書き込む際には、fprintf関数を使うのが一般的です。

この関数は、指定したフォーマットに従ってデータをファイルに書き込むことができます。

fprintf関数を使った数値の書き込み

fprintf関数の基本的な使い方は以下の通りです。

fprintf(file_pointer, "フォーマット", 値);

ここで、file_pointerは書き込み先のファイルを指すポインタ、フォーマットは書き込むデータの形式を指定する文字列、は書き込む数値です。

例えば、整数をファイルに書き込む場合は次のようにします。

int number = 42;
fprintf(file_pointer, "%d\n", number); // 整数を1行書き込む

整数、浮動小数点数の書き込み

整数や浮動小数点数をファイルに書き込む際には、それぞれ異なるフォーマット指定子を使用します。

  • 整数の場合は%dを使用します。
  • 浮動小数点数の場合は%fを使用します。

以下に、整数と浮動小数点数をファイルに書き込む例を示します。

int intValue = 100;
float floatValue = 3.14;
fprintf(file_pointer, "%d\n", intValue);   // 整数の書き込み
fprintf(file_pointer, "%f\n", floatValue);  // 浮動小数点数の書き込み

書き込み例

実際に数値をファイルに書き込むプログラムの例を見てみましょう。

以下のコードは、整数と浮動小数点数をファイルに書き込むプログラムです。

#include <stdio.h>
int main() {
    FILE *file = fopen("output.txt", "w"); // 書き込み用にファイルをオープン
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    int intValue = 100;
    float floatValue = 3.14;
    fprintf(file, "%d\n", intValue);   // 整数の書き込み
    fprintf(file, "%f\n", floatValue);  // 浮動小数点数の書き込み
    fclose(file); // ファイルをクローズ
    return 0;
}

このプログラムを実行すると、output.txtというファイルに整数と浮動小数点数がそれぞれ1行ずつ書き込まれます。

数値を1行ずつ書き込むサンプルコード

次に、複数の数値を1行ずつ書き込むサンプルコードを示します。

この例では、配列に格納された整数をファイルに書き込みます。

#include <stdio.h>
int main() {
    FILE *file = fopen("numbers.txt", "w"); // 書き込み用にファイルをオープン
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    int numbers[] = {1, 2, 3, 4, 5}; // 書き込む整数の配列
    int size = sizeof(numbers) / sizeof(numbers[0]); // 配列のサイズ
    for (int i = 0; i < size; i++) {
        fprintf(file, "%d\n", numbers[i]); // 各整数を1行ずつ書き込む
    }
    fclose(file); // ファイルをクローズ
    return 0;
}

このプログラムを実行すると、numbers.txtというファイルに1から5までの整数がそれぞれ1行ずつ書き込まれます。

エラーチェックの実装

ファイル操作を行う際には、エラーチェックが非常に重要です。

ファイルが正常にオープンできたか、書き込みが成功したかを確認することで、プログラムの信頼性を高めることができます。

以下は、エラーチェックを実装した例です。

#include <stdio.h>
int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        perror("ファイルを開けませんでした"); // エラーメッセージを表示
        return 1;
    }
    int intValue = 100;
    if (fprintf(file, "%d\n", intValue) < 0) {
        perror("書き込みに失敗しました"); // 書き込みエラーのチェック
        fclose(file);
        return 1;
    }
    fclose(file);
    return 0;
}

このプログラムでは、ファイルをオープンできなかった場合や書き込みに失敗した場合にエラーメッセージを表示します。

perror関数を使うことで、エラーの詳細を表示することができます。

エラーハンドリング

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

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

ここでは、ファイル操作におけるエラー処理の基本について解説します。

ファイル操作におけるエラー処理

ファイルを開く、書き込む、読み込むといった操作は、さまざまな理由で失敗する可能性があります。

これらのエラーを適切に処理することで、プログラムの信頼性を高めることができます。

以下に、一般的なファイル操作におけるエラーの種類を示します。

エラーの種類

ファイル操作を行う際には、様々なエラーが発生する可能性があります。以下に、代表的なエラーの種類とそれぞれの詳細について説明します。

ファイルが存在しない

指定したファイルが存在しない場合、そのファイルを開くことができません。

このエラーは通常、ファイルパスが間違っているか、ファイルが削除された場合に発生します。

プログラム内でファイルを操作する前に、そのファイルが存在するかどうかを確認することが推奨されます。

アクセス権限の不足

読み込みや書き込みの権限がない場合、ファイル操作が失敗します。

このエラーは、ファイルやディレクトリのパーミッション設定が不適切である場合に発生します。

特に共有環境やシステム管理者によって設定された制限が原因となることが多いです。

アクセス権限を確認し、必要に応じて適切な権限を設定することが重要です。

ディスクの空き容量不足

書き込みを行う際に、ディスクの空き容量が不足していると、書き込みができません。

このエラーは、大量のデータを処理するプログラムやログファイルの増大によりディスク容量が逼迫した場合に発生します。

ディスクの使用状況を監視し、定期的に不要なファイルを削除することが推奨されます。

ファイルの破損

ファイルが破損している場合、正しく読み込むことができません。

このエラーは、ファイルが不完全に保存されたり、ディスクエラーやウイルス感染などによりファイルが損傷を受けた場合に発生します。

定期的なバックアップを行い、ファイルの整合性を確認することで、このリスクを軽減することができます。

メモリ不足

プログラムが必要とするメモリが不足している場合、ファイル操作が失敗することがあります。

特に、大規模なファイルを扱う際にこの問題が発生することが多いです。

システムのメモリ使用量を監視し、必要に応じてメモリを増設することや、プログラムのメモリ使用効率を改善することが重要です。

エラーメッセージの表示方法

C言語では、ファイル操作に失敗した場合、エラーメッセージを表示するためにperror関数strerror関数を使用することができます。

これらの関数は、エラーの原因を示すメッセージを出力します。

以下は、fopen関数を使用してファイルを開く際のエラーハンドリングの例です。

#include <stdio.h>
#include <stdlib.h>
int main() {
    FILE *file;
    // ファイルを開く
    file = fopen("example.txt", "r");
    if (file == NULL) {
        // エラーが発生した場合、エラーメッセージを表示
        perror("ファイルを開くことができません");
        return EXIT_FAILURE; // 異常終了
    }
    // ファイル操作を行う
    // ...
    // ファイルを閉じる
    fclose(file);
    return EXIT_SUCCESS; // 正常終了
}

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

perrorは、直前のエラーに関する説明を標準エラー出力に出力します。

また、strerror関数を使うことで、エラーコードに基づいたエラーメッセージを取得することもできます。

以下はその例です。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    FILE *file;
    // ファイルを開く
    file = fopen("example.txt", "r");
    if (file == NULL) {
        // エラーコードを取得
        int errnum = errno;
        // エラーメッセージを表示
        fprintf(stderr, "ファイルを開くことができません: %s\n", strerror(errnum));
        return EXIT_FAILURE; // 異常終了
    }
    // ファイル操作を行う
    // ...
    // ファイルを閉じる
    fclose(file);
    return EXIT_SUCCESS; // 正常終了
}

このように、エラーハンドリングを適切に行うことで、プログラムの信頼性を向上させることができます。

ファイル操作を行う際には、必ずエラー処理を実装することを心がけましょう。

実践的な応用

複数行のデータを書き込む

プログラムで複数行のデータをファイルに書き込むことは、データの保存やログの記録など、さまざまな場面で必要になります。

ここでは、ループを使った書き込みと配列を使ったデータの書き込みについて解説します。

ループを使った書き込み

ループを使用することで、同じ処理を繰り返し行うことができます。

例えば、1から10までの整数をファイルに書き込む場合、以下のように記述します。

#include <stdio.h>
int main() {
    FILE *file;
    file = fopen("output.txt", "w"); // 書き込み用にファイルをオープン
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1; // エラー処理
    }
    for (int i = 1; i <= 10; i++) {
        fprintf(file, "%d\n", i); // 整数を1行ずつ書き込む
    }
    fclose(file); // ファイルをクローズ
    return 0;
}

このプログラムを実行すると、output.txtというファイルに1から10までの整数が1行ずつ書き込まれます。

配列を使ったデータの書き込み

配列を使うことで、複数のデータを一度に管理し、ファイルに書き込むことができます。

以下の例では、文字列の配列をファイルに書き込む方法を示します。

#include <stdio.h>
int main() {
    FILE *file;
    file = fopen("output.txt", "w"); // 書き込み用にファイルをオープン
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1; // エラー処理
    }
    const char *lines[] = {
        "こんにちは、世界!",
        "C言語は面白い。",
        "ファイル操作を学びましょう。"
    };
    for (int i = 0; i < 3; i++) {
        fputs(lines[i], file); // 文字列をファイルに書き込む
        fputs("\n", file); // 改行を追加
    }
    fclose(file); // ファイルをクローズ
    return 0;
}

このプログラムを実行すると、output.txtに3つの文字列がそれぞれ1行ずつ書き込まれます。

ユーザー入力をファイルに書き込む

ユーザーからの入力を受け取り、そのデータをファイルに書き込むこともよく行われます。

ここでは、scanf関数を使ったユーザー入力と、そのデータをファイルに書き込む方法を解説します。

scanf関数を使ったユーザー入力

scanf関数を使用して、ユーザーからの入力を受け取ることができます。

以下の例では、ユーザーから名前を入力してもらい、その名前をファイルに書き込むプログラムを示します。

#include <stdio.h>
int main() {
    FILE *file;
    char name[100]; // ユーザーの名前を格納するための配列
    file = fopen("output.txt", "w"); // 書き込み用にファイルをオープン
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1; // エラー処理
    }
    printf("名前を入力してください: ");
    scanf("%99s", name); // ユーザーから名前を入力
    fprintf(file, "ユーザーの名前: %s\n", name); // 名前をファイルに書き込む
    fclose(file); // ファイルをクローズ
    return 0;
}

このプログラムを実行すると、ユーザーが入力した名前がoutput.txtに書き込まれます。

入力データのファイルへの書き込み

複数のデータをユーザーから受け取り、それをファイルに書き込むことも可能です。

以下の例では、ユーザーから複数の整数を入力してもらい、それをファイルに書き込むプログラムを示します。

#include <stdio.h>
int main() {
    FILE *file;
    int number;
    file = fopen("output.txt", "w"); // 書き込み用にファイルをオープン
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1; // エラー処理
    }
    printf("整数を入力してください(-1で終了):\n");
    while (1) {
        scanf("%d", &number); // ユーザーから整数を入力
        if (number == -1) { // -1が入力されたら終了
            break;
        }
        fprintf(file, "%d\n", number); // 整数をファイルに書き込む
    }
    fclose(file); // ファイルをクローズ
    return 0;
}

このプログラムを実行すると、ユーザーが入力した整数がoutput.txtに1行ずつ書き込まれます。

-1を入力することで、入力が終了します。

目次から探す