【C言語】ファイルを読み込んで2次元配列に格納する

この記事では、C言語を使ってファイルからデータを読み込み、2次元配列に格納する方法について解説します。

具体的には、テキストファイルの形式やデータの読み込み方法、配列への格納方法、そしてデータの整合性チェックについて学びます。

さらに、CSVファイルの読み込みや動的配列の使い方など、実践的な応用例も紹介します。

目次から探す

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

C言語では、ファイルからデータを読み込むことが非常に重要です。

特に、2次元配列にデータを格納する場合、ファイルからの読み込みは不可欠です。

このセクションでは、テキストファイルの形式から始まり、データの読み込み方法、そして2次元配列への格納方法について詳しく解説します。

テキストファイルの形式

ファイルからデータを読み込む際、まずはそのファイルの形式を理解する必要があります。

一般的に、テキストファイルは以下のような形式でデータが格納されています。

1 2 3
4 5 6
7 8 9

この例では、3行3列の整数データが格納されています。

各行は空白で区切られた数値で構成されており、これを2次元配列に格納することが目標です。

fscanf関数の使い方

fscanf関数は、ファイルからデータを読み込むための関数です。

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

FILE *file;
file = fopen("data.txt", "r"); // ファイルを読み込みモードでオープン
if (file == NULL) {
    printf("ファイルを開けませんでした。\n");
    return 1;
}
int a, b, c;
fscanf(file, "%d %d %d", &a, &b, &c); // ファイルから3つの整数を読み込む
fclose(file); // ファイルを閉じる

このコードでは、data.txtというファイルから3つの整数を読み込んでいます。

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

fgets関数を用いた行単位の読み込み

fgets関数を使うと、ファイルから1行ずつデータを読み込むことができます。

これにより、行ごとにデータを処理することが可能です。

char line[100];
FILE *file;
file = fopen("data.txt", "r");
if (file == NULL) {
    printf("ファイルを開けませんでした。\n");
    return 1;
}
while (fgets(line, sizeof(line), file)) {
    printf("%s", line); // 読み込んだ行を表示
}
fclose(file);

このコードでは、data.txtから1行ずつ読み込み、その内容を表示しています。

読み込んだデータを2次元配列に格納する

配列のサイズの決定

2次元配列にデータを格納するためには、まず配列のサイズを決定する必要があります。

例えば、3行3列の整数を格納する場合、次のように配列を宣言します。

int array[3][3];

ループを用いたデータの格納

次に、ファイルから読み込んだデータを2次元配列に格納します。

fscanfを使って、各行のデータを配列に格納する例を示します。

FILE *file;
file = fopen("data.txt", "r");
if (file == NULL) {
    printf("ファイルを開けませんでした。\n");
    return 1;
}
int array[3][3];
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        fscanf(file, "%d", &array[i][j]); // ファイルから整数を読み込んで配列に格納
    }
}
fclose(file);

このコードでは、data.txtから3行3列の整数を読み込み、arrayに格納しています。

データの整合性チェック

データを読み込んだ後は、整合性をチェックすることが重要です。

例えば、ファイルの行数や列数が期待通りであるかを確認します。

if (fscanf(file, "%d", &value) != 1) {
    printf("データの読み込みに失敗しました。\n");
}

このように、読み込んだデータの数が期待通りであるかを確認することで、エラーを未然に防ぐことができます。

完成したコード

以下に、ファイルからデータを読み込み、2次元配列に格納する完成したコードを示します。

#include <stdio.h>
int main() {
    FILE *file;
    file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    int array[3][3];
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (fscanf(file, "%d", &array[i][j]) != 1) {
                printf("データの読み込みに失敗しました。\n");
                fclose(file);
                return 1;
            }
        }
    }
    fclose(file);
    // 読み込んだデータの表示
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
    return 0;
}

このプログラムは、data.txtから3行3列の整数を読み込み、2次元配列に格納し、その内容を表示します。

ファイルのオープンやデータの読み込みに失敗した場合は、適切なエラーメッセージを表示します。

応用例

CSVファイルの読み込み

CSV(Comma-Separated Values)ファイルは、データをカンマで区切って保存する形式で、特に表形式のデータを扱う際に広く使用されています。

C言語でCSVファイルを読み込む場合、fgets関数を使って行を読み込み、strtok関数でカンマで分割する方法が一般的です。

以下は、CSVファイルを読み込んで2次元配列に格納するサンプルコードです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ROWS 100
#define MAX_COLS 10
#define MAX_LINE_LENGTH 256
int main() {
    FILE *file;
    char line[MAX_LINE_LENGTH];
    char *token;
    int data[MAX_ROWS][MAX_COLS];
    int row = 0;
    // CSVファイルを開く
    file = fopen("data.csv", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return EXIT_FAILURE;
    }
    // 行を読み込む
    while (fgets(line, sizeof(line), file) && row < MAX_ROWS) {
        int col = 0;
        // カンマで分割
        token = strtok(line, ",");
        while (token != NULL && col < MAX_COLS) {
            data[row][col] = atoi(token); // 整数に変換して格納
            token = strtok(NULL, ",");
            col++;
        }
        row++;
    }
    fclose(file);
    // 読み込んだデータを表示
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < MAX_COLS; j++) {
            printf("%d ", data[i][j]);
        }
        printf("\n");
    }
    return 0;
}

このコードでは、data.csvというファイルからデータを読み込み、2次元配列に格納しています。

各行はカンマで分割され、整数に変換されて配列に保存されます。

動的配列を用いた柔軟なデータ処理

固定サイズの配列では、データの量が不明な場合に対応できません。

そこで、動的配列を使用することで、必要に応じてメモリを確保し、柔軟にデータを処理することができます。

C言語では、mallocreallocを使って動的にメモリを管理します。

以下は、動的配列を使用して2次元配列を作成する例です。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int rows, cols;
    printf("行数を入力してください: ");
    scanf("%d", &rows);
    printf("列数を入力してください: ");
    scanf("%d", &cols);
    // 動的配列の確保
    int **data = (int **)malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        data[i] = (int *)malloc(cols * sizeof(int));
    }
    // データの入力
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("data[%d][%d] = ", i, j);
            scanf("%d", &data[i][j]);
        }
    }
    // データの表示
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", data[i][j]);
        }
        printf("\n");
    }
    // メモリの解放
    for (int i = 0; i < rows; i++) {
        free(data[i]);
    }
    free(data);
    return 0;
}

このコードでは、ユーザーから行数と列数を入力させ、そのサイズに応じた動的な2次元配列を作成しています。

データの入力後、メモリを解放することも忘れずに行います。

他のデータ形式への対応

C言語では、テキストファイル以外にもバイナリファイルやJSON、XMLなどのデータ形式を扱うことができます。

バイナリファイルの場合、freadfwriteを使用してデータを直接読み書きします。

JSONやXMLの場合は、専用のライブラリを使用することで、データのパースや生成が容易になります。

ファイル操作の重要性と便利さ

ファイル操作は、プログラムがデータを永続的に保存したり、外部データを読み込んだりするために不可欠です。

データベースのような大規模なデータ管理から、単純な設定ファイルの読み書きまで、ファイル操作の技術は非常に重要です。

C言語では、標準ライブラリを使用することで、簡単にファイルを操作することができます。

C言語におけるファイル読み込みの基本技術

C言語でのファイル読み込みには、いくつかの基本的な技術があります。

主なものは以下の通りです。

  • ファイルポインタの使用: FILE型のポインタを使用して、ファイルを開いたり閉じたりします。
  • 読み込み関数の選択: fscanffgetsfreadなど、目的に応じた関数を選択します。
  • エラーチェック: ファイルのオープンや読み込みに失敗した場合のエラーチェックを行います。
  • メモリ管理: 動的配列を使用する場合は、メモリの確保と解放を適切に行います。

これらの技術を理解し、使いこなすことで、C言語でのファイル操作がよりスムーズになります。

目次から探す