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

この記事では、C言語を使ってテキストファイルから数値を読み込み、数値に変換して処理する方法について解説します。

具体的には、ファイルを読み込むための関数や、文字列を数値に変換する方法、そして読み込んだ数値を使って計算を行い、結果を出力する手順を紹介します。

これを学ぶことで、ファイル操作やデータ処理の基本を理解できるようになります。

目次から探す

テキストファイルの読み込み

C言語では、ファイルからデータを読み込むためのいくつかの関数が用意されています。

ここでは、テキストファイルから数値を読み込むための代表的な関数であるfgetsfscanffgetcについて解説します。

fgets関数の使用

fgets関数は、指定したファイルから一行分のテキストを読み込むための関数です。

この関数は、行の終わりまでまたは指定したバッファのサイズまで読み込みます。

以下は、fgetsを使用してファイルから数値を読み込む例です。

#include <stdio.h>
#include <stdlib.h>
int main() {
    FILE *file;
    char buffer[100];
    // ファイルを開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // ファイルから一行を読み込む
    if (fgets(buffer, sizeof(buffer), file) != NULL) {
        // 読み込んだ内容を表示
        printf("読み込んだ行: %s", buffer);
    }
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このコードでは、numbers.txtというファイルから一行を読み込み、その内容を表示します。

fgetsは、読み込んだ文字列をbufferに格納します。

fscanf関数の使用

fscanf関数は、フォーマット指定子を使ってファイルからデータを読み込むための関数です。

数値を直接読み込むのに便利です。

以下は、fscanfを使用してファイルから整数を読み込む例です。

#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) {
        // 読み込んだ整数を表示
        printf("読み込んだ数値: %d\n", number);
    }
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このコードでは、numbers.txtから整数を読み込み、読み込んだ数値を表示します。

fscanf関数の場合は、直接数値として取得できます。

fscanfは、ファイルから整数を読み込む際に、フォーマット指定子%dを使用しています。

fgetc関数の使用

fgetc関数は、ファイルから1文字ずつ読み込むための関数です。

数値を文字として読み込み、後で変換することができます。

以下は、fgetcを使用してファイルから数値を読み込む例です。

#include <stdio.h>
#include <stdlib.h>
int main() {
    FILE *file;
    int ch;
    // ファイルを開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // ファイルから1文字ずつ読み込む
    while ((ch = fgetc(file)) != EOF) {
        // 読み込んだ文字を表示
        printf("読み込んだ文字: %c\n", ch);
    }
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このコードでは、numbers.txtから1文字ずつ読み込み、数字であればその文字を表示します。

fgetcは、EOF(End Of File)に達するまで文字を読み込み続けます。

これらの関数を使うことで、テキストファイルから数値を効率的に読み込むことができます。

次のセクションでは、読み込んだテキストを数値に変換する方法について解説します。

テキストから数値への変換

テキストファイルから読み込んだデータは、通常は文字列として扱われます。

しかし、数値として利用するためには、これらの文字列を数値に変換する必要があります。

ここでは、C言語でよく使われる数値変換の関数について解説します。

atoi関数の使い方

atoi関数は、文字列を整数に変換するための簡単な関数です。

以下のように使用します。

#include <stdio.h>
#include <stdlib.h>
int main() {
    const char *str = "12345"; // 変換したい文字列
    int num = atoi(str); // 文字列を整数に変換
    printf("変換結果: %d\n", num); // 結果を表示
    return 0;
}

このコードでは、文字列 12345atoi関数を使って整数に変換し、その結果を表示しています。

atoiは非常にシンプルですが、エラーチェックがないため、無効な文字列が渡された場合の動作には注意が必要です。

strtol関数の使い方

strtol関数は、文字列を長整数に変換するための関数で、エラーチェックが可能です。

以下のように使用します。

#include <stdio.h>
#include <stdlib.h>
int main() {
    const char *str = "12345abc"; // 変換したい文字列
    char *endptr; // 変換が終了した位置を指すポインタ
    long num = strtol(str, &endptr, 10); // 文字列を長整数に変換
    if (endptr == str) {
        printf("変換できませんでした。\n");
    } else {
        printf("変換結果: %ld\n", num); // 結果を表示
    }
    return 0;
}

このコードでは、strtolを使って文字列 12345abc を長整数に変換しています。

endptrは、変換が終了した位置を指し示します。

もし endptr が元の文字列 str と同じであれば、変換に失敗したことを示します。

このように、strtolはエラーチェックができるため、より安全に使用できます。

sscanf関数の使い方

sscanf関数は、文字列からフォーマットに従ってデータを読み取るための関数です。

以下のように使用します。

#include <stdio.h>
int main() {
    const char *str = "123 456"; // 変換したい文字列
    int num1, num2;
    // 文字列から2つの整数を読み取る
    int result = sscanf(str, "%d %d", &num1, &num2);
    if (result == 2) {
        printf("変換結果: %d, %d\n", num1, num2); // 結果を表示
    } else {
        printf("変換に失敗しました。\n");
    }
    return 0;
}

このコードでは、文字列 123 456 から2つの整数を sscanfを使って読み取っています。

sscanfは、指定したフォーマットに従ってデータを読み取るため、複数の値を一度に取得するのに便利です。

変換に成功した場合は、読み取った整数を表示します。

これらの関数を使うことで、テキストファイルから読み込んだデータを数値として扱うことができ、さまざまな計算や処理に利用することができます。

読み込んだ数値の利用例

ファイルから読み込んだ数値を処理するためには、まずそれらの数値を配列に格納し、その後必要な計算を行い、最後に結果を出力する必要があります。

ここでは、これらのステップを詳しく解説します。

数値の配列への格納

ファイルから読み込んだ数値を配列に格納することで、後の計算処理が容易になります。

以下のサンプルコードでは、テキストファイルから数値を読み込み、配列に格納する方法を示します。

#include <stdio.h>
#include <stdlib.h>
#define MAX_NUMBERS 100 // 最大数値の数
int main() {
    FILE *file;
    int numbers[MAX_NUMBERS];
    int count = 0;
    // ファイルを開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // ファイルから数値を読み込む
    while (fscanf(file, "%d", &numbers[count]) != EOF && count < MAX_NUMBERS) {
        count++;
    }
    // ファイルを閉じる
    fclose(file);
    // 読み込んだ数値を表示
    printf("読み込んだ数値:\n");
    for (int i = 0; i < count; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");
    return 0;
}

このコードでは、numbers.txtというファイルから整数を読み込み、numbersという配列に格納しています。

fscanf関数を使用して、ファイルから数値を読み込んでいます。

数値の計算処理

配列に格納した数値を使って、さまざまな計算を行うことができます。

例えば、合計や平均を計算することが一般的です。

以下のサンプルコードでは、読み込んだ数値の合計と平均を計算しています。

#include <stdio.h>
#include <stdlib.h>
#define MAX_NUMBERS 100
int main() {
    FILE *file;
    int numbers[MAX_NUMBERS];
    int count = 0;
    int sum = 0;
    // ファイルを開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // ファイルから数値を読み込む
    while (fscanf(file, "%d", &numbers[count]) != EOF && count < MAX_NUMBERS) {
        sum += numbers[count]; // 合計を計算
        count++;
    }
    // ファイルを閉じる
    fclose(file);
    // 合計と平均を計算
    double average = (count > 0) ? (double)sum / count : 0;
    // 結果を表示
    printf("合計: %d\n", sum);
    printf("平均: %.2f\n", average);
    return 0;
}

このコードでは、合計を計算するために、sum変数を使用しています。

ファイルから読み込んだ数値をすべて合計し、最後に平均を計算して出力しています。

結果の出力

計算結果を出力する際には、printf関数を使用して、コンソールに結果を表示します。

上記の例では、合計と平均を表示していますが、他にも必要に応じてさまざまな形式で出力することができます。

例えば、結果をファイルに書き込むことも可能です。

以下のコードは、計算結果を新しいファイルに書き込む方法を示しています。

#include <stdio.h>
#include <stdlib.h>
#define MAX_NUMBERS 100
int main() {
    FILE *inputFile, *outputFile;
    int numbers[MAX_NUMBERS];
    int count = 0;
    int sum = 0;
    // 入力ファイルを開く
    inputFile = fopen("numbers.txt", "r");
    if (inputFile == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // 数値を読み込む
    while (fscanf(inputFile, "%d", &numbers[count]) != EOF && count < MAX_NUMBERS) {
        sum += numbers[count];
        count++;
    }
    fclose(inputFile);
    // 平均を計算
    double average = (count > 0) ? (double)sum / count : 0;
    // 出力ファイルを開く
    outputFile = fopen("results.txt", "w");
    if (outputFile == NULL) {
        perror("出力ファイルを開けませんでした");
        return 1;
    }
    // 結果を書き込む
    fprintf(outputFile, "合計: %d\n", sum);
    fprintf(outputFile, "平均: %.2f\n", average);
    fclose(outputFile);
    printf("結果をresults.txtに書き込みました。\n");
    return 0;
}

このコードでは、計算結果をresults.txtというファイルに書き込んでいます。

fprintf関数を使用して、ファイルに出力しています。

以上のように、ファイルから読み込んだ数値を配列に格納し、計算処理を行い、結果を出力する一連の流れを理解することで、C言語でのファイル操作や数値処理の基本を習得することができます。

目次から探す