Feof(ファイル *f)の使用方法は?
-
29-09-2019 - |
質問
私はdo-whileループで苦労しています。これは、ファイルの最後に到達したときに停止することになっています。これがループコードです:
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));
デバッガーで走った後、私が持っているすべてのクラッシュの問題は、それがライン全体に到達したとしてもこのループから出ないからであることに気付きました。
どのように正しく書くべきですか?
解決
私はあなたのループとロジックを変更してこれを使用します:
while (fgets(pcompanyRow, 1024, f) != NULL) {
/* do things */
}
fgets()がファイルの終わりを過ぎて読み込もうとすると、nullが返され、ループから抜け出します。引き続き使用し続けることができます pass
他のフラグ/ロジックですが、確認する条件はわずかに異なります。
他のヒント
ループのExitインジケーターとしてFeof()を使用しないでください。 feof()は、eofに到達したときではなく、ファイル(EOF)の終了後にのみ真です
ソース ここ. 。また、問題を詳細に説明し、どのように修正するかについても説明しています。
fgets()とfeof()の両方を使用することをお勧めします。ファイルの最後の文字列には nがあるか、そうでない場合があります。 feof()のみを使用する場合、最後の行をスキップ(紛失)できます。
for(;;)
{char *pc;
pc=fgets(buf,sizeof(buf),fd);
if(!pc)
{//it may be read error or end of file
if(feof(fd))
{//it is end of file, normal exit from for
break;
}
else
{//it is i/o error
fclose(fd);
return 2;
}
}
}//for
所属していません StackOverflow