[C言語] ファイルのテキストを数値として読み込む方法

C言語でファイルからテキストを数値として読み込むには、まずfopen関数を使用してファイルを開きます。

次に、fscanf関数を用いてファイルからデータを読み込み、数値に変換します。

この際、適切なフォーマット指定子を使用することで、整数や浮動小数点数などの異なる数値型を読み込むことが可能です。

読み込みが完了したら、fclose関数でファイルを閉じることを忘れないようにしましょう。

これにより、ファイル内のテキストデータを数値としてプログラム内で利用することができます。

この記事でわかること
  • fgets、fscanf、fgetcを使ったファイルからのデータ読み込み方法
  • atoi、atof、strtol、strtod、sscanfを用いた数値データの変換方法
  • ファイル操作や数値変換におけるエラーハンドリングの手法
  • CSVファイルや設定ファイルからのデータ読み込みの応用例

目次から探す

テキストファイルからのデータ読み込み

テキストファイルからデータを読み込む方法は、C言語プログラミングにおいて非常に重要です。

ここでは、fgetsfscanffgetcの各関数を使ったデータの読み込み方法について解説します。

fgets関数の使い方

fgets関数は、ファイルから1行ずつ文字列を読み込むために使用されます。

以下に基本的な使い方を示します。

#include <stdio.h>
int main() {
    FILE *file;
    char buffer[256]; // 読み込む文字列を格納するバッファ
    // ファイルを読み込みモードで開く
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // ファイルから1行ずつ読み込む
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer); // 読み込んだ行を出力
    }
    fclose(file); // ファイルを閉じる
    return 0;
}
ファイルの内容がそのまま出力されます。
`fgets`は改行文字も含めて読み込むため、行ごとに出力されます。

fscanf関数による数値の読み込み

fscanf関数は、ファイルからフォーマットに従ってデータを読み込むために使用されます。

数値を読み込む際に便利です。

#include <stdio.h>
int main() {
    FILE *file;
    int number;
    // ファイルを読み込みモードで開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // ファイルから数値を読み込む
    while (fscanf(file, "%d", &number) != EOF) {
        printf("読み込んだ数値: %d\n", number);
    }
    fclose(file); // ファイルを閉じる
    return 0;
}
ファイル内の数値が1つずつ読み込まれ、
出力されます。`fscanf`は指定したフォーマットに従ってデータを解析します。

fgetc関数での文字単位の読み込み

fgetc関数は、ファイルから1文字ずつ読み込むために使用されます。

文字単位での処理が必要な場合に役立ちます。

#include <stdio.h>
int main() {
    FILE *file;
    int ch; // 文字を格納する変数
    // ファイルを読み込みモードで開く
    file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // ファイルから1文字ずつ読み込む
    while ((ch = fgetc(file)) != EOF) {
        putchar(ch); // 読み込んだ文字を出力
    }
    fclose(file); // ファイルを閉じる
    return 0;
}
ファイルの内容が1文字ずつ出力されます。
`fgetc`はEOFに達するまで1文字ずつ読み込みます。

これらの関数を使い分けることで、ファイルからのデータ読み込みを効率的に行うことができます。

用途に応じて適切な関数を選択してください。

数値データの変換

テキストファイルから読み込んだデータを数値に変換することは、C言語プログラミングにおいてよくある作業です。

ここでは、atoiatofstrtolstrtodsscanf関数を使った数値データの変換方法について解説します。

atoi関数とatof関数の使い方

atoi関数atof関数は、文字列をそれぞれ整数と浮動小数点数に変換するために使用されます。

#include <stdio.h>
#include <stdlib.h>
int main() {
    char intStr[] = "123";
    char floatStr[] = "456.78";
    // 文字列を整数に変換
    int number = atoi(intStr);
    printf("整数に変換: %d\n", number);
    // 文字列を浮動小数点数に変換
    double decimal = atof(floatStr);
    printf("浮動小数点数に変換: %f\n", decimal);
    return 0;
}
文字列 "123" が整数 123 に、"456.78" が浮動小数点数 456.780000 に変換されます。
`atoi`と`atof`は簡単に文字列を数値に変換できますが、エラーチェックができない点に注意が必要です。

strtol関数とstrtod関数の活用

strtol関数strtod関数は、文字列をそれぞれ長整数と浮動小数点数に変換し、変換に失敗した場合のエラーチェックも可能です。

#include <stdio.h>
#include <stdlib.h>
int main() {
    char intStr[] = "123abc";
    char floatStr[] = "456.78xyz";
    char *endPtr;
    // 文字列を長整数に変換
    long int number = strtol(intStr, &endPtr, 10);
    printf("長整数に変換: %ld, 残りの文字列: %s\n", number, endPtr);
    // 文字列を浮動小数点数に変換
    double decimal = strtod(floatStr, &endPtr);
    printf("浮動小数点数に変換: %f, 残りの文字列: %s\n", decimal, endPtr);
    return 0;
}
文字列 "123abc" が長整数 123 に変換され、"abc" が変換されずに残ります。
同様に、"456.78xyz" が浮動小数点数 456.780000 に変換され、"xyz" が残ります。
`strtol`と`strtod`は変換できなかった部分を示すポインタを返すため、エラーチェックが可能です。

sscanf関数によるフォーマット指定

sscanf関数は、文字列から指定したフォーマットに従ってデータを解析し、変数に格納します。

#include <stdio.h>
int main() {
    char data[] = "123 456.78";
    int number;
    double decimal;
    // 文字列から整数と浮動小数点数を解析
    sscanf(data, "%d %lf", &number, &decimal);
    printf("解析した整数: %d\n", number);
    printf("解析した浮動小数点数: %f\n", decimal);
    return 0;
}
文字列 "123 456.78" から整数 123 と浮動小数点数 456.780000 が解析されます。
`sscanf`はフォーマット指定子を使って、複数のデータ型を一度に解析できるため、非常に便利です。

これらの関数を使い分けることで、文字列から数値への変換を効率的に行うことができます。

用途に応じて適切な関数を選択してください。

エラーハンドリング

プログラムが正しく動作するためには、エラーハンドリングが重要です。

特にファイル操作やデータ変換においては、エラーが発生する可能性が高いため、適切な対処法を知っておくことが必要です。

ファイルが開けない場合の対処法

ファイルを開く際に失敗することがあります。

これは、ファイルが存在しない、権限がない、または他の理由によるものです。

fopen関数NULLを返した場合にエラーメッセージを表示し、プログラムを終了するのが一般的です。

#include <stdio.h>
int main() {
    FILE *file;
    // ファイルを読み込みモードで開く
    file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // ファイル操作...
    fclose(file); // ファイルを閉じる
    return 0;
}

perror関数は、エラーメッセージを標準エラー出力に表示します。

これにより、エラーの原因を特定しやすくなります。

読み込みエラーの検出と処理

ファイルからのデータ読み込み中にエラーが発生することがあります。

fscanffgetsなどの関数は、エラーを示す特定の値を返します。

これを利用してエラーを検出し、適切に処理します。

#include <stdio.h>
int main() {
    FILE *file;
    int number;
    // ファイルを読み込みモードで開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // ファイルから数値を読み込む
    while (fscanf(file, "%d", &number) != 1) {
        if (feof(file)) {
            printf("ファイルの終端に達しました。\n");
            break;
        }
        if (ferror(file)) {
            printf("読み込みエラーが発生しました。\n");
            break;
        }
    }
    fclose(file); // ファイルを閉じる
    return 0;
}

feof関数はファイルの終端に達したかどうかを確認し、ferror関数は読み込みエラーが発生したかどうかを確認します。

数値変換時のエラー処理

文字列を数値に変換する際に、無効な文字列が渡されるとエラーが発生します。

strtolstrtod関数を使用することで、変換に失敗した場合のエラーチェックが可能です。

#include <stdio.h>
#include <stdlib.h>
int main() {
    char intStr[] = "123abc";
    char *endPtr;
    // 文字列を長整数に変換
    long int number = strtol(intStr, &endPtr, 10);
    if (*endPtr != '
#include <stdio.h>
#include <stdlib.h>
int main() {
    char intStr[] = "123abc";
    char *endPtr;
    // 文字列を長整数に変換
    long int number = strtol(intStr, &endPtr, 10);
    if (*endPtr != '\0') {
        printf("変換に失敗しました。無効な文字列: %s\n", endPtr);
    } else {
        printf("変換成功: %ld\n", number);
    }
    return 0;
}
') { printf("変換に失敗しました。無効な文字列: %s\n", endPtr); } else { printf("変換成功: %ld\n", number); } return 0; }

strtol関数は、変換できなかった部分を示すポインタを返します。

これを利用して、変換が成功したかどうかを確認できます。

無効な文字列が含まれている場合は、エラーメッセージを表示します。

これらのエラーハンドリング手法を活用することで、プログラムの信頼性を向上させることができます。

エラーが発生した場合でも、適切に対処することで、プログラムのクラッシュを防ぎ、ユーザーに有用な情報を提供できます。

応用例

ファイルからのデータ読み込みは、さまざまな応用が可能です。

ここでは、CSVファイルからの数値データの読み込み、複数行の数値データを配列に格納する方法、テキストファイルから設定値を読み込む方法について解説します。

CSVファイルからの数値データ読み込み

CSVファイルは、カンマで区切られたデータを持つファイル形式です。

fgetsstrtokを組み合わせて、CSVファイルから数値データを読み込むことができます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    FILE *file;
    char buffer[256];
    const char *delimiter = ",";
    char *token;
    int number;
    // CSVファイルを読み込みモードで開く
    file = fopen("data.csv", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // ファイルから1行ずつ読み込む
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        // カンマで区切られたトークンを取得
        token = strtok(buffer, delimiter);
        while (token != NULL) {
            // 文字列を整数に変換
            number = atoi(token);
            printf("読み込んだ数値: %d\n", number);
            token = strtok(NULL, delimiter);
        }
    }
    fclose(file); // ファイルを閉じる
    return 0;
}

このプログラムは、CSVファイルから数値を1つずつ読み込み、出力します。

strtok関数を使って、カンマで区切られたデータを解析します。

複数行の数値データを配列に格納

複数行にわたる数値データを配列に格納することで、後でデータを処理しやすくなります。

#include <stdio.h>
#include <stdlib.h>
#define MAX_LINES 100
#define MAX_NUMBERS_PER_LINE 10
int main() {
    FILE *file;
    int data[MAX_LINES][MAX_NUMBERS_PER_LINE];
    int line = 0, col = 0;
    char buffer[256];
    // ファイルを読み込みモードで開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // ファイルから1行ずつ読み込む
    while (fgets(buffer, sizeof(buffer), file) != NULL && line < MAX_LINES) {
        col = 0;
        char *token = strtok(buffer, " ");
        while (token != NULL && col < MAX_NUMBERS_PER_LINE) {
            data[line][col] = atoi(token);
            col++;
            token = strtok(NULL, " ");
        }
        line++;
    }
    fclose(file); // ファイルを閉じる
    // 配列の内容を出力
    for (int i = 0; i < line; i++) {
        for (int j = 0; j < col; j++) {
            printf("%d ", data[i][j]);
        }
        printf("\n");
    }
    return 0;
}

このプログラムは、ファイルから読み込んだ数値データを2次元配列に格納し、後で出力します。

strtokを使って、スペースで区切られた数値を解析します。

テキストファイルからの設定値読み込み

設定ファイルからキーと値のペアを読み込むことで、プログラムの動作を柔軟に変更できます。

#include <stdio.h>
#include <string.h>
#define MAX_LINE_LENGTH 256
int main() {
    FILE *file;
    char buffer[MAX_LINE_LENGTH];
    char key[128];
    char value[128];
    // 設定ファイルを読み込みモードで開く
    file = fopen("config.txt", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // ファイルから1行ずつ読み込む
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        // キーと値を解析
        if (sscanf(buffer, "%127[^=]=%127s", key, value) == 2) {
            printf("キー: %s, 値: %s\n", key, value);
        }
    }
    fclose(file); // ファイルを閉じる
    return 0;
}

このプログラムは、設定ファイルからキーと値のペアを読み込み、出力します。

sscanfを使って、=で区切られたキーと値を解析します。

これらの応用例を通じて、ファイルからのデータ読み込みをさまざまな形で活用する方法を学ぶことができます。

用途に応じて適切な手法を選択してください。

よくある質問

fscanfとfgetsの違いは何ですか?

fscanffgetsはどちらもファイルからデータを読み込むための関数ですが、用途と動作が異なります。

  • fscanfは、指定したフォーマットに従ってデータを解析し、変数に格納します。

数値や特定のデータ型を直接読み込むのに適しています。

例:fscanf(file, "%d", &number);

  • fgetsは、ファイルから1行ずつ文字列としてデータを読み込みます。

行全体を文字列として処理したい場合に適しています。

例:fgets(buffer, sizeof(buffer), file);

数値変換が失敗する原因は何ですか?

数値変換が失敗する原因はいくつか考えられます。

  • 文字列に数値以外の文字が含まれている場合、変換が失敗します。

例えば、”123abc”を整数に変換しようとすると失敗します。

  • 変換対象の文字列が空である場合、変換は行われません。
  • 変換しようとする数値が、変数のデータ型の範囲を超えている場合も失敗します。

ファイルの終端を検出する方法は?

ファイルの終端を検出するには、feof関数を使用します。

feofは、ファイルポインタがファイルの終端に達したかどうかを確認します。

  • feof(file)は、ファイルの終端に達している場合に非ゼロの値を返します。

これを利用して、ループの終了条件として使用できます。

まとめ

ファイルからのデータ読み込みと数値変換は、C言語プログラミングにおいて重要なスキルです。

この記事では、ファイル操作の基本から応用例、エラーハンドリングまでを詳しく解説しました。

これらの知識を活用して、より堅牢で柔軟なプログラムを作成してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す