2010-11-28 15 views
2

do-whileループで苦労しています。ファイルの最後に到達すると、 が停止するはずです。ここではループコードは次のとおりです。feof(FILE * f)の使い方は?

do { 
    if (pcompanyRow[0] != '#' && pass == 1) { 
     strtok(pcompanyRow, ":"); 
     pcompanyName = strcpy(pcompanyName, strtok(NULL, "")); 
     pass = 2; 
     fgets(pcompanyRow, 1024, f); 
    } 
    if (pcompanyRow[0] != '#' && pass == 2) { 
     strtok(pcompanyRow, ":"); 
     pcompanySMSPrice = strcpy(pcompanySMSPrice, strtok(NULL , "")); 
     pass = 3; 
     fgets(pcompanyRow, 1024 , f); 
    } 
    if (pcompanyRow[0] != '#' && pass == 3) { 
     strtok(pcompanyRow, ":"); 
     pcompanyMMSPrice = strcpy(pcompanyMMSPrice, strtok(NULL, "")); 
     pass = 4; 
     fgets(pcompanyRow, 1024, f); 
    } 
    if (pass == 4) { 
     AppendCompanyNode(pcompanyList, pcompanyName, pcompanySMSPrice, pcompanyMMSPrice); 
     pass = 1; 
    } 
} while (!feof(f)); 

デバッガで実行した後、私はそれが全体のラインに達した場合でも、このループの外に行かないので、私が持っているすべてのクラッシュの問題があることに気づきました。

正しく書き込むにはどうすればよいですか?

+1

答えとして、簡潔な答えは「あなたはfeof()を使用しない」です。 'feof()'を使用する唯一の方法は、プライマリ入力関数(例えばfgets()など)からエラーまたはエラーの表示を取得し、EOFとエラーを区別したい場合です。たいていの場合、ほとんどの人は2つのものを区別することはできません(具体的には、私が見たコードのほとんど)。私は 'feof() 'をまったく思い出しません。これはおそらく私がC言語プログラミングの最後の四半世紀に何度か使ったことを意味しています。 –

+0

@Jonathan:エラーが発生したかどうかを知りたい場合は、 '!feof(f)'ではなく 'ferror(f)'をチェックする方がはるかに意味があると思います。ときどき 'feof'はdo-whileループで役に立ちますが、私はそれがほとんど役に立たないことに同意します。 –

+0

@R ..:はい、 'feof()'よりも 'ferror()'を使うほうが理にかなっていますが、私はしばしばそれを使用しないと告白します。しかし私は私のコメントでそう言っていたはずです - あるいは、私が宇宙を使い果たしてから2番目のものを追加しました。 –

答えて

4

私はこれを使用するようにループとロジックを変更します

while (fgets(pcompanyRow, 1024, f) != NULL) { 

    /* do things */ 

} 

のfgets()は、ファイルの末尾を越えて読み取ろうとするとき、それはNULLを返します、あなたはループから抜け出すだろう。 passと他のフラグ/ロジックを引き続き使用できますが、チェックする条件は若干異なります。

+0

ループが完了したら、feof(f)を使ってEOFかエラーかを調べることができます – EvilTeach

+0

エラーがあったかどうかを判断するのに 'feof'ではなく' ferror'を使用します... –

+0

これは私がやったことですまだそれは止まらない!私にラインを引き寄せる –

8

ループの終了インジケータとしてfeof()を使用しないでください。 feof()は、ファイルの終わり(EOF)が読み取られた後にのみTRUEになります。

ソースhere。また、問題の詳細と解決方法についても説明します。

+0

私はそれをwhileに変更しました:while(fgets(pcompanyRow、1024、f)!= NULL) –

+0

とにかくそれは止まらない!!私はpcompanyRowの値を見ることができます、それは最初の行をもう一度取った、それは私のループのファイル行を持っていないと停止...私は何ができますか? –

+1

+1、しかし私は文言に疑問を呈します。 EOFは決して「読む」ことはありません。 read関数は、ファイルの終わりに遭遇した結果としてEOFを返すかもしれませんが、EOFは読み取られた値ではありません。 –

関連する問題