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 %sn", fullName);
      }
    else
      {
      for (ii=0; ii < ((inCan->ac)-1); ii++)
        {
        fscanf(fp, "%*d %*d %*dn"); /*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,并且terminate被加1。Feof对于第三行再次返回true,并且第二次结束递增。

feof()不检测文件是否已结束。它检测最后一次读取错误是否由于文件已结束。

feof()只在读取失败后发生。

因此,首先读取数据并检查返回值。如果读取失败,使用feof()确保读取失败是因为到达了文件结束符(读取失败的其他原因是某种错误(网络故障,坏扇区,打印机着火,…),可以用ferror()检测到)。

在不知道数据格式的情况下很难判断,但是

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

将读取3个值,但在最后一行,它不会读取行结束字符,所以它不是文件的结束。

试题:

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

相关内容

  • 没有找到相关文章

最新更新