fscanf

ストリーム (stream) から書式文字列に従ってデータを読み込みます.

#include <stdio.h>
int fscanf(
    FILE * restrict stream,
    const char * restrict format,
    ...
);

fscanf 関数は format が指す書式文字列に従って stream が指すストリームからデータを読込み,format に続く引数の指すオブジェクトに代入します.

注意!
fscanf はバッファオーバーフロー (buffer over-flow) を発生させやすい関数の 1 つです.

引数

戻り値

  • 成功した場合: 代入された入力項目の個数
  • 失敗した場合: EOF

C言語サンプルプログラム

fscanf 関数を使用してCSVファイルを読み取るサンプルプログラムを使用します.

/* header files */
#include <stdio.h>
#include <stdlib.h>

/* macros */
#define DATA_MAX 1024

/* structures */
typedef struct csv_template {
    double x1;
    double x2;
    double x3;
} Csv;

/* main */
int main(void) {
    int i, data_count;
    FILE *fp;
    char file_name[] = "sample.csv";
    Csv csv[DATA_MAX];

    /* ファイルオープン */
    if ((fp = fopen(file_name, "r")) == NULL) {
        fprintf(stderr, "%s\n", "error: can't read file.");
        return EXIT_FAILURE;
    }

    /* サンプルファイルを読み込む */
    i = 0;
    while (fscanf(fp, "%lf,%lf,%lf", &csv[i].x1, &csv[i].x2, &csv[i].x3) != EOF){
        i++;
    }
    data_count = i;

    /* ファイルクローズ */
    fclose(fp);

    /* 表示 */
    for ( i = 0; i < data_count; i++ ) {
        printf("%.2f, %.2f, %.2f\n", csv[i].x1, csv[i].x2, csv[i].x3);
    }
    printf("データの数: %d\n", data_count);

    return EXIT_SUCCESS;
}

sample.txtの内容

sample.txt を以下のように用意したとします.

001,100.0,10
002,86.1,8
003,95.4,9

実行例

サンプルプログラムの実行結果は以下のようになります.

1.00, 100.00, 10.00
2.00, 86.10, 8.00
3.00, 95.40, 9.00
データの数: 3

cプログラマの必読書

たくさんあるc言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

c実践プログラミング 第3版

c言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.


c言語ポインタ完全制覇 (標準プログラマーズライブラリ)

ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.