≫ ホーム ≫ C言語ヘッダファイル別一覧 | C言語アルファベット別一覧 ≫ stdio.h ≫ fscanf
ストリーム (stream) から書式文字列に従ってデータを読み込みます.
#include <stdio.h>
int fscanf( FILE * restrict stream, const char * restrict format, ... );
fscanf 関数は format が指す書式文字列に従って stream が指すストリームからデータを読込み,format に続く引数の指すオブジェクトに代入します.
注意!
fscanf はバッファオーバーフロー (buffer over-flow) を発生させやすい関数の 1 つです.
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 を以下のように用意したとします.
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言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります.
オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.
ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.