質問

私は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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top