No.16702![]() |
fscanf関数 投稿者---チェリーC(2004/09/09 13:24:38) |
||
fscanf関数について教えてください。 以下のプログラムを実行すると ループが終わりませんでした。 どこがおかしいのでしょうか? #include <stdio.h> int main (){ FILE *fp; int a, b; fp = fopen("test.dat", "r"); while(fscanf(fp, "%d%d", &a, &b) != EOF){ printf("%3d %3d\n", a, b); } fclose(fp); return 0; } |
No.16705![]() |
Re:fscanf関数 投稿者---とおりすがり(2004/09/09 13:44:10) |
||
プログラムは、おかしくないです。 test.dat のファイルに、数字以外のものあるのではないですか? |
No.16707![]() |
Re:fscanf関数 投稿者---チェリーC(2004/09/09 13:47:05) |
||
test.datの中身です。 1 23 3 44 3 5O 実行すると"3 5"という行がずっと表示されてしまいます。 |
No.16709![]() |
Re:fscanf関数 投稿者---あかま(2004/09/09 13:55:41) |
||
>1 23 >3 44 >3 5O 5のあとが英字の"オー"です。 |
No.16708![]() |
Re:fscanf関数 投稿者---あかま(2004/09/09 13:54:39) |
||
新ANSI C言語辞典から 「fscanf」 返却値 1.代入された入力項目数を返す。この数は、入力文字と書式が一致しない場合は予期していたものより小さくなることがあり、0にもなり得る。 2.いずれかの変換の前に入力失敗が発生した場合は、EOFを返す。 つまり 書式が一致しない→それまで読み込んだ数(0〜) ファイルが終了→EOF ってことだと思う。 書式が一致しないと、次の読み込みで同じところを読み込むので また失敗して無限ループになります。 回避にはfgets,sscanfを組み合わせるのがいいでしょう。 |
No.16711![]() |
Re:fscanf関数 投稿者---チェリーC(2004/09/09 14:00:52) |
||
はい 3 5OのOが英字のOでした。 修正したところきちんと動作しました。 お手数かけてすみませんでした。 |