【C言語】ファイルの数値を読み込んで計算する方法

この記事では、C言語を使ってファイルから数値データを読み込み、さまざまな計算を行う方法について学びます。

テキストファイルやバイナリファイルからのデータの読み込み方、基本的な加算や減算、さらに複雑な計算の実装方法を紹介します。

これを通じて、プログラミングの基礎を理解し、実際のデータを使った計算ができるようになります。

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

目次から探す

数値データの読み込み

C言語では、ファイルから数値データを読み込むことがよくあります。

ここでは、テキストファイルとバイナリファイルの両方から数値を読み込む方法について解説します。

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

テキストファイルから数値を読み込む方法には、主にfscanf関数fgets関数を使用した方法があります。

fscanf関数の使い方

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

このプログラムでは、numbers.txtというファイルから整数を読み込み、読み込んだ数値を表示します。

fscanfは、ファイルから整数を1つずつ読み込み、成功した場合は1を返します。

fgetsとsscanfの組み合わせ

fgets関数を使って1行ずつ読み込み、その後sscanfで数値を抽出する方法もあります。

この方法は、行全体を読み込んでから処理を行うため、柔軟性があります。

#include <stdio.h>
int main() {
    FILE *file;
    char line[100];
    int number;
    // ファイルを開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // 行を読み込む
    while (fgets(line, sizeof(line), file) != NULL) {
        // 行から整数を抽出
        if (sscanf(line, "%d", &number) == 1) {
            printf("読み込んだ数値: %d\n", number);
        }
    }
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このプログラムでは、fgetsで1行ずつ読み込み、sscanfを使ってその行から整数を抽出しています。

これにより、行の形式が異なる場合でも対応しやすくなります。

バイナリファイルからのデータ読み込み

バイナリファイルから数値を読み込む場合、fread関数を使用します。

バイナリファイルは、データがそのままの形式で保存されているため、効率的に読み込むことができます。

fread関数の使い方

fread関数は、指定したバイト数のデータをファイルから読み込むことができます。

以下は、バイナリファイルから整数を読み込む例です。

#include <stdio.h>
int main() {
    FILE *file;
    int number;
    // バイナリファイルを開く
    file = fopen("numbers.bin", "rb");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // 整数を読み込む
    while (fread(&number, sizeof(int), 1, file) == 1) {
        printf("読み込んだ数値: %d\n", number);
    }
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このプログラムでは、numbers.binというバイナリファイルから整数を1つずつ読み込み、表示します。

freadは、指定したサイズのデータを読み込み、成功した場合は読み込んだ要素数を返します。

バイナリデータの構造体との関連

バイナリファイルでは、構造体を使って複数のデータをまとめて読み込むこともできます。

以下は、構造体を使った例です。

#include <stdio.h>
typedef struct {
    int id;
    float value;
} Data;
int main() {
    FILE *file;
    Data data;
    // バイナリファイルを開く
    file = fopen("data.bin", "rb");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // 構造体を読み込む
    while (fread(&data, sizeof(Data), 1, file) == 1) {
        printf("ID: %d, 値: %.2f\n", data.id, data.value);
    }
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このプログラムでは、Dataという構造体を定義し、バイナリファイルからその構造体のデータを読み込んでいます。

これにより、複数の関連するデータを一度に扱うことができます。

読み込んだ数値の計算

数値データをファイルから読み込んだ後は、それらの数値を使って計算を行うことができます。

ここでは、基本的な算術演算から複雑な計算の実装方法、そして結果の出力方法について解説します。

基本的な算術演算

C言語では、加算、減算、乗算、除算といった基本的な算術演算を簡単に行うことができます。

これらの演算は、数値データを処理する際に非常に重要です。

加算、減算

まずは、加算と減算の例を見てみましょう。

以下のサンプルコードでは、ファイルから読み込んだ2つの数値を加算し、その結果を表示します。

#include <stdio.h>
int main() {
    FILE *file;
    int num1, num2, sum, difference;
    // ファイルを開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // 数値を読み込む
    fscanf(file, "%d %d", &num1, &num2);
    fclose(file);
    // 加算と減算
    sum = num1 + num2; // 加算
    difference = num1 - num2; // 減算
    // 結果を表示
    printf("加算結果: %d\n", sum);
    printf("減算結果: %d\n", difference);
    return 0;
}

このコードでは、numbers.txtというファイルから2つの整数を読み込み、それらを加算および減算して結果を表示します。

乗算、除算

次に、乗算と除算の例を見てみましょう。

以下のサンプルコードでは、同様にファイルから読み込んだ数値を使って乗算と除算を行います。

#include <stdio.h>
int main() {
    FILE *file;
    float num1, num2, product, quotient;
    // ファイルを開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // 数値を読み込む
    fscanf(file, "%f %f", &num1, &num2);
    fclose(file);
    // 乗算と除算
    product = num1 * num2; // 乗算
    if (num2 != 0) {
        quotient = num1 / num2; // 除算
        printf("除算結果: %.2f\n", quotient);
    } else {
        printf("ゼロで除算することはできません。\n");
    }
    // 結果を表示
    printf("乗算結果: %.2f\n", product);
    return 0;
}

このコードでは、浮動小数点数を扱い、乗算と除算の結果を表示します。

除算の際には、ゼロ除算を避けるためのチェックも行っています。

複雑な計算の実装

基本的な演算に加えて、より複雑な計算を行うことも可能です。

ここでは、配列を用いた計算と、関数を使った計算の分割について説明します。

配列を用いた計算

配列を使用することで、複数の数値を一度に処理することができます。

以下のサンプルコードでは、ファイルから読み込んだ数値を配列に格納し、合計と平均を計算します。

#include <stdio.h>
int main() {
    FILE *file;
    int numbers[100];
    int count = 0;
    int sum = 0;
    float average;
    // ファイルを開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // 数値を読み込む
    while (fscanf(file, "%d", &numbers[count]) != EOF) {
        sum += numbers[count]; // 合計を計算
        count++;
    }
    fclose(file);
    // 平均を計算
    if (count > 0) {
        average = (float)sum / count;
        printf("合計: %d\n", sum);
        printf("平均: %.2f\n", average);
    } else {
        printf("数値が読み込まれませんでした。\n");
    }
    return 0;
}

このコードでは、ファイルから複数の整数を読み込み、合計と平均を計算して表示します。

関数を使った計算の分割

計算を関数に分割することで、コードの可読性と再利用性が向上します。

以下のサンプルコードでは、合計と平均を計算するための関数を定義しています。

#include <stdio.h>
void calculateSumAndAverage(int numbers[], int count, int *sum, float *average) {
    *sum = 0;
    for (int i = 0; i < count; i++) {
        *sum += numbers[i];
    }
    *average = (float)(*sum) / count;
}
int main() {
    FILE *file;
    int numbers[100];
    int count = 0;
    int sum;
    float average;
    // ファイルを開く
    file = fopen("numbers.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // 数値を読み込む
    while (fscanf(file, "%d", &numbers[count]) != EOF) {
        count++;
    }
    fclose(file);
    // 合計と平均を計算
    if (count > 0) {
        calculateSumAndAverage(numbers, count, &sum, &average);
        printf("合計: %d\n", sum);
        printf("平均: %.2f\n", average);
    } else {
        printf("数値が読み込まれませんでした。\n");
    }
    return 0;
}

このコードでは、calculateSumAndAverageという関数を定義し、合計と平均を計算しています。

これにより、メイン関数がすっきりとし、計算ロジックが分離されます。

結果の出力

計算結果を出力する際には、printf関数を使用します。

数値のフォーマットを指定することで、見やすい形で結果を表示することができます。

例えば、浮動小数点数の場合は小数点以下の桁数を指定することができます。

printf("結果: %.2f\n", result); // 小数点以下2桁まで表示

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

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

#include <stdio.h>
int main() {
    FILE *file;
    int sum = 100; // 例として合計を100とする
    float average = 50.0; // 例として平均を50.0とする
    // 結果をファイルに書き込む
    file = fopen("results.txt", "w");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    fprintf(file, "合計: %d\n", sum);
    fprintf(file, "平均: %.2f\n", average);
    fclose(file);
    printf("結果をresults.txtに書き込みました。\n");
    return 0;
}

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

fprintf関数を使用することで、フォーマットを指定して出力することができます。

以上のように、C言語を使用してファイルから数値を読み込み、さまざまな計算を行い、その結果を出力する方法について解説しました。

これらの基本的な技術を組み合わせることで、より複雑なプログラムを作成することが可能になります。

目次から探す