C言語関係掲示板

過去ログ

No.1265 fscanfで無限ループ

[戻る] [ホームページ]
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でした。
修正したところきちんと動作しました。
お手数かけてすみませんでした。