feof检测文件的错误结束

时间:2013-05-19 08:48:59

标签: c scanf feof

我早些时候提出了一个不同的问题,但是我对这个问题的看法很偏僻,所以我提出了一个新的问题,因为我问的是一个完全不同的问题。

我有一个函数读取文本文件中的给定行(由ac变量给出)。它执行行的读取,然后检查这是否是文件中的最后一行。如果是这样,它会增加一个值。

问题是,即使它不是文件的实际结尾,它也会增加值。我认为我使用的是错误但是我没有运气让它起作用:

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正确分配值。在第二行,feof返回true并且终止递增。 feof在第3行再次返回true,增量在第二次终止。

2 个答案:

答案 0 :(得分:1)

feof()未检测到文件是否已结束。它检测上次读取错误是否是由于文件已经结束。

feof()仅在读取失败后才会发生。

因此,首先读取数据并检查返回值。如果读取失败,请使用feof()确保失败,因为已达到END-OF-FILE(读取失败的其他原因是某种错误(网络故障,坏扇区,打印机着火,...... 。),ferror()可检测到。

答案 1 :(得分:1)

在不知道数据格式的情况下很难分辨,但

 fscanf(fp,"%d %d %d", &inCan->ac, &inCan->state, &inCan->time); 

将读取3个值,但在最后一行,它将不会读取行尾字符,因此它不是文件的末尾。

尝试:

 fscanf(fp,"%d %d %d\n", &inCan->ac, &inCan->state, &inCan->time);