【C言語】ファイルを2行目から読み込む方法

この記事では、C言語を使ってファイルからデータを読み込む方法について学びます。

特に、1行目をスキップして2行目からデータを取得する方法や、CSVファイルの読み込み、特定の条件に基づいて行を選んで表示する方法を紹介します。

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

目次から探す

2行目からの読み込み

C言語でファイルを扱う際、特定の行からデータを読み込むことが求められる場合があります。

特に、1行目にはヘッダー情報が含まれているCSVファイルなどでは、2行目からデータを読み込む必要があります。

ここでは、1行目をスキップして2行目からデータを読み込む方法について解説します。

1行目をスキップする方法

ファイルを開いてデータを読み込む際、最初の行をスキップするためには、まずファイルを開き、1行目を読み込んで捨てる必要があります。

以下はその基本的な手順を示すサンプルコードです。

#include <stdio.h>
int main() {
    FILE *file;
    char buffer[256];
    // ファイルを開く
    file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // 1行目を読み込んでスキップ
    fgets(buffer, sizeof(buffer), file);
    // 2行目を読み込む
    if (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("2行目の内容: %s", buffer);
    }
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このコードでは、まずファイルを開き、fgets関数を使って1行目を読み込みます。

この時、読み込んだ内容はbufferに格納されますが、特に使用することはありません。

その後、再度fgetsを呼び出して2行目を読み込み、内容を表示します。

2行目以降のデータ処理

2行目以降のデータを処理するためには、ループを使ってファイルの終わりまで読み続けることが一般的です。

以下のサンプルコードでは、2行目以降の全ての行を読み込み、各行の内容を表示します。

#include <stdio.h>
int main() {
    FILE *file;
    char buffer[256];
    // ファイルを開く
    file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    // 1行目をスキップ
    fgets(buffer, sizeof(buffer), file);
    // 2行目以降を読み込む
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("読み込んだ行: %s", buffer);
    }
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このコードでは、whileループを使用してファイルの各行を読み込み、内容を表示しています。

fgetsがNULLを返すまで、つまりファイルの終わりに達するまでループが続きます。

これにより、2行目以降の全てのデータを効率的に処理することができます。

このように、C言語を使ってファイルの特定の行からデータを読み込む方法を理解することで、さまざまなデータ処理のニーズに応じたプログラムを作成することが可能になります。

応用例

CSVファイルの読み込み

CSV(Comma-Separated Values)ファイルは、データをカンマで区切って保存する形式で、データのやり取りに広く使われています。

C言語でCSVファイルを読み込む際も、特定の行からデータを取得することができます。

ここでは、2行目からCSVファイルを読み込む方法を紹介します。

以下のサンプルコードでは、CSVファイルの1行目をスキップし、2行目以降のデータを読み込んで表示します。

#include <stdio.h>
int main() {
    FILE *file;
    char line[256];
    // CSVファイルを開く
    file = fopen("data.csv", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // 1行目をスキップ
    fgets(line, sizeof(line), file);
    // 2行目以降を読み込む
    while (fgets(line, sizeof(line), file)) {
        // 読み込んだ行を表示
        printf("%s", line);
    }
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このコードでは、まずファイルを開き、fgets関数を使って1行目を読み飛ばします。

その後、whileループを使って2行目以降のデータを読み込み、各行を表示します。

CSVファイルの内容が以下のような場合を考えます。

名前,年齢,職業
田中,30,エンジニア
佐藤,25,デザイナー
鈴木,28,マネージャー

このプログラムを実行すると、次のような出力が得られます。

田中,30,エンジニア
佐藤,25,デザイナー
鈴木,28,マネージャー

特定の条件に基づく行の読み込み

特定の条件に基づいて行を読み込むことも可能です。

たとえば、年齢が30歳以上の人だけを表示するプログラムを作成してみましょう。

以下のサンプルコードでは、2行目以降のデータを読み込み、年齢が30歳以上の行だけを表示します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    FILE *file;
    char line[256];
    char *token;
    // CSVファイルを開く
    file = fopen("data.csv", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    // 1行目をスキップ
    fgets(line, sizeof(line), file);
    // 2行目以降を読み込む
    while (fgets(line, sizeof(line), file)) {
        // カンマで区切ってトークンを取得
        token = strtok(line, ",");
        int age = 0;
        // 年齢を取得
        for (int i = 0; i < 2; i++) {
            token = strtok(NULL, ",");
            if (i == 1) {
                age = atoi(token); // 年齢を整数に変換
            }
        }
        // 年齢が30歳以上の場合に表示
        if (age >= 30) {
            printf("%s", line);
        }
    }
    // ファイルを閉じる
    fclose(file);
    return 0;
}

このプログラムでは、strtok関数を使ってカンマで区切られた各トークンを取得し、年齢を整数に変換しています。

年齢が30歳以上の場合にのみ、その行を表示します。

CSVファイルの内容が同じであれば、出力は次のようになります。

田中,30,エンジニア

このように、C言語を使ってファイルを読み込み、特定の条件に基づいてデータを処理することができます。

これにより、さまざまなデータ分析や処理が可能になります。

目次から探す