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));
デバッガで実行した後、私はそれが全体のラインに達した場合でも、このループの外に行かないので、私が持っているすべてのクラッシュの問題があることに気づきました。
正しく書き込むにはどうすればよいですか?
答えとして、簡潔な答えは「あなたはfeof()を使用しない」です。 'feof()'を使用する唯一の方法は、プライマリ入力関数(例えばfgets()など)からエラーまたはエラーの表示を取得し、EOFとエラーを区別したい場合です。たいていの場合、ほとんどの人は2つのものを区別することはできません(具体的には、私が見たコードのほとんど)。私は 'feof() 'をまったく思い出しません。これはおそらく私がC言語プログラミングの最後の四半世紀に何度か使ったことを意味しています。 –
@Jonathan:エラーが発生したかどうかを知りたい場合は、 '!feof(f)'ではなく 'ferror(f)'をチェックする方がはるかに意味があると思います。ときどき 'feof'はdo-whileループで役に立ちますが、私はそれがほとんど役に立たないことに同意します。 –
@R ..:はい、 'feof()'よりも 'ferror()'を使うほうが理にかなっていますが、私はしばしばそれを使用しないと告白します。しかし私は私のコメントでそう言っていたはずです - あるいは、私が宇宙を使い果たしてから2番目のものを追加しました。 –