fscanfの戻り値は、設定できたデータの数でした。
これを利用すれば、変数に正しく設定できたかが分かります。
例えば、次のような記述で、変数a と b の2つに設定できたかが分かるわかるわけです。
if(fscanf(入力につながるストリームデータ, "%d%d", &a, &b) == 2){ /* 正しく入力できた時の処理 */ }
ファイルストリームから読み取る場合も、順番に取得されるデータが正しいく設定できているか、 このようなfscanfの戻り値の判定でチェックします。
次のプログラム例は、下図のようなファイルがこのプログラム実行可能ファイルと同じ場所にある場合、
このファイルからデータを順番に1つずつ読み取りって表示し、変数sum に追加し、最後にsumを表示するプログラムです
ファイルからの入力データを『表示してsum に追加する処理』は変数dに正しくデータが記憶できた場合だけ行っています
なお、ファイルが無い時にfscanfを実行すると実行エラーが起きるので、そうならないようにプログラムで強制的に終了するifを書いています。
#include <stdio.h> #include <stdlib.h> /* exit関数を使うためのインクルード */ main() { int d = 0; /* 入力用 */ int sum = 0; /* 合計用 */ int n; /* 入力データ総個数カウント用 */ FILE * fpr; /* readストリーム記憶用*/ fpr = fopen( "test.txt" , "r"); if( fpr == NULL ) { fprintf(stdout, "ファイルオープンエラー\n"); exit(1); /* プログラムを強制終了する命令です */ } n = 0; if(fscanf(fpr, "%d" , &d) == 1){/* 入力して、変数1つに正しくセットできたか?*/ fprintf(stdout, "d=%d\n",d); sum += d; n = n + 1; } if(fscanf(fpr, "%d" , &d) == 1){/* 入力して、変数1つに正しくセットできたか?*/ fprintf(stdout, "d=%d\n",d); sum += d; n = n + 1; } if(fscanf(fpr, "%d" , &d) == 1){/* 入力して、変数1つに正しくセットできたか?*/ fprintf(stdout, "d=%d\n",d); sum += d; n = n + 1; } fclose(fpr); fprintf(stdout, "%d個の合計は、%dです\n", n, sum); }
薄い部分は、青をコピーして作っています。
このプログラムで3つの入力しかしていないので、
ファイルの先頭から3つのデータまでしか読み取らない次の結果になります。
d=4 d=3 d=6 3個の合計は、13です
これを、ファイルの最後まで読み取る処理にするには、繰り返しが必要になります。
次のプログラムは、先頭の1行だけを読み取るプログラムになっているので、whileを追加して完成させなさい。
なお、whileの条件の中でfscanfを使う手法で書きなさい。
これはfscanfを使う場合の定石となるプログラムパターンです。
←編集 入力後に クリックください。
←わからない場合は、クリック