2017-11-02 6 views
-3

fscanfを使用して次のような問題を解決しました。fscanfが関数の値<1を返すのをチェックするのはなぜですか?

サイズSIZEの配列xをテキストファイルから読み込んだ整数で初期化する関数を記述します。関数は引数としてファイルの名前を受け取ります。

解決策は以下のとおりです。ファイル内の各整数をスキャンしている場合、fscanfが値<を返すのはなぜですか? fscanfはスキャンされた要素の数を返すので、0より大きくないはずですか?あなたは、コードの意図誤解しているように見える

void init (char *name) 
{ 
    FILE *fp; 
    int i; 

    fp = fopen (name, "r"); 
    if (fp == NULL) 
    { 
     printf ("no file\n"); 
     return; 
    } 

    for (i = 0; i < SIZE; i++) 
    { 
     if (fscanf (fp, "%d", &x[i]) < 1) 
     { 
      printf ("got %d numbers\n", i); 
      return; 
     } 
    } 

    fclose (fp); 
    return; 
} 
+0

したがって、<1を返した場合、何もスキャンされませんでした。おそらく、データがなくなったでしょうか?おそらくエラーがありますか? – John3136

+0

マニュアルページをお読みください。 '関数は、正常に埋め込まれた引数リストの項目数を返します。この数は、一致する失敗、読み込みエラー、またはファイルの終わりのために予想される項目数に一致するか、またはそれよりも少なくなります(ゼロですら)。 – Gaurav

+0

Linuxの場合、端末に 'man fscanf'と入力するだけで' fscanf'のAPIリファレンスマニュアルを開き、_ **戻り値** _の下のセクションを読むことができます。これは任意の関数呼び出しになります。 – Gaurav

答えて

2

:これは何をするか

for (i = 0; i < SIZE; i++) 
{ 
    if (fscanf (fp, "%d", &x[i]) < 1) 
    { 
     printf ("got %d numbers\n", i); 
     return; 
    } 
} 

fscanfが整数で読み取ることがに失敗した場合に返さある(それがスキャンされた項目の数を返します。 )。だから、その時点で関数は(a)を返します。

正の整数を取得すると、値を正常に読み取ることができ、ループが続行されることを意味します。ファイルが道を閉鎖しませんので、


は、(a)はおそらくべきここbreakではなく、リターンをそれが現時点です。

+0

おそらく、OPは 'printf'を' perror'に置き換えなければなりません。このようにして実際に 'fscanf'が何を返して0を返すかを出力する必要があります。 – Gaurav

+1

@Gaurav - ' errno'は、 'fscanf()'によって期待されるときには整数です。つまり、ここでは 'perror()'はおそらく役に立たないでしょう。 –

+0

@paxdiabloこれは、基本的に、fscanfがファイル内の整数を読み取ることができなくなったときに、これを解消するという長年の方法です。 –

0

なぜファイル内の各整数をスキャンしている場合、fscanfは値<を返しますか?

fscanf (fp, "%d", &x[i])

戻り値:

1intが正常にスキャン。コードは、追加の読み取りにループintのみ非数値非空白入力がファイルの終わりに(EOFは、いくつかの負の値である)

EOFを検出

0

EOF入力時(まれ)


if (fscanf (fp, "%d", &x[i]) < 1)では、分岐は最後の3つの条件の一つとしているが発生しました - おそらくファイルの終わりを。

関連する問題