0

これについては以前に別の質問をしましたが、問題については的外れだったので、まったく別の質問をしているので、新しい質問を作成しました。

テキストファイルの特定の行を読み取る関数があります(ac変数で指定)。行の読み取りを実行し、それがファイルの最後の行であるかどうかを確認します。その場合、値を増やします。

問題は、ファイルの実際の末尾ではない場合でも、値がインクリメントされることです。私は feof を間違って使用していると思いますが、それを機能させることができませんでした:

int readIn(TinCan* inCan, int toggle)
  {
  int ii, isFinished = 0;
  char fullName[20];
  sprintf(fullName, "Label_%d.txt", inCan->pid);

  FILE* fp; 
    fp = fopen(fullName, "r");

    if(fp==NULL) 
      {
      printf("Error: could not open %s\n", fullName);
      }

    else
      {
      for (ii=0; ii < ((inCan->ac)-1); ii++)
        {
        fscanf(fp, "%*d %*d %*d\n"); /*move through lines without scanning*/
        }
      fscanf(fp,"%d %d %d", &inCan->ac, &inCan->state, &inCan->time);
      }

    if (feof(fp) && (toggle == 1)) 
      {
      printf("File ended"); 
      writeLog(inCan);
      isFinished = 1;
      terminated++;
      }

  fclose(fp);
  return finished;
  }

リクエストに応じたサンプル データ。これは私が使用できるテキスト ファイルです。

1 1 30
2 2 5
3 1 1

fscanf は値を正しく割り当てます。2 行目で、feof は true を返し、terminated がインクリメントされます。feof は 3 行目で再び true を返し、インクリメントは 2 回目に終了します。

4

2 に答える 2

1

feof()ファイルが終了したかどうかを検出しません。最後の読み取りエラーがファイルの終了によるものかどうかを検出します。

feof()読み取りに失敗した後にのみ発生します。

ということで、まずはデータを読み込んで戻り値をチェック。読み取りが失敗した場合は、END-OF-FILE に達したために読み取りが失敗したことを確認するために使用feof()します (読み取りが失敗するその他の理由は、何らかのエラー (ネットワークのダウン、不良セクター、プリンターの発火など) です)。ferror())。

于 2013-05-19T09:03:18.157 に答える