C言語クイズ解答 - fscanf関数




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



fscanfを使ってデータファイル(test.dat)から数値を読み込むプログラムを作りましたが、3, 5という行が表示され続けプログラムが終了しません。 どこに問題があるのか考えてみてください。


#include <stdio.h>

main ()
{
	FILE  *fp;
	int   a, b;

	if((fp = fopen("test.dat", "r")) == NULL)
		return;
	while(fscanf(fp, "%d %d\n", &a, &b) != EOF){
		printf("%d, %d\n", a, b);
	}
	fclose(fp);
}


test.datの内容
1 23
3 44
3 5O
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...


*** 以下は解答です ***



while(fscanf(...) != EOF)のような書き方は時々見かけますが、これでは入力するデータに間違いがあると無限ループになってしまいます。
実は、このデータにも誤りがあり3行目に50と入力したかったのに0(ゼロ)と(オー)が間違っています。
さいわいfscanfは読み込んだデータの数を返してくるので、それが2でなければエラーとしてループを抜けるようにすれば一応使えるプログラムになります。 ただし、fscanf関数ではエラーチェックが甘くなるのでfgets関数などでデータを読み込み、それを処理していく方法が良いと思います。


[an error occurred while processing this directive]