2

ファイルの最後に到達すると停止するはずの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));

デバッガーで実行した後、私が抱えているすべてのクラッシュの問題は、それが行全体に達してもこのループから出ないためであることに気づきました。

どうすれば正しく書くことができますか?

4

3 に答える 3

8

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

ソースはこちら。また、問題の詳細と修正方法についても説明します。

于 2010-11-28T22:01:10.583 に答える
4

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

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

    /* do things */

}

fgets()がファイルの終わりを超えて読み込もうとすると、NULLが返され、ループから抜け出します。引き続き使用passしたり、他のフラグ/ロジックを使用したりできますが、チェックする条件は少し異なります。

于 2010-11-28T22:12:25.917 に答える
0

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
于 2018-10-11T08:02:43.167 に答える