【问题标题】:feof detecting false end of filefeof 检测到错误的文件结尾
【发布时间】:2013-05-19 08:48:58
【问题描述】:

我之前问过一个不同的问题,但我对这个问题的认识还很遥远,所以我创建了一个新问题,因为我问的是一个完全不同的问题。

我有一个函数可以读取文本文件中的给定行(由 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 正确分配了值。在第二行, feof 返回 true 并增加了 terminate。 feof 在第 3 行再次返回 true 并再次终止增量。

【问题讨论】:

  • 返回完成,我认为是完成
  • 哦,很奇怪。是的,@marabutt 所说的——如果编译完成,那么完成的是某个地方的全局变量,而且它不是你认为你要返回的东西。或者你在将它复制到 stackoverflow 时打错了
  • 在这种情况下不需要feof(fp),因为在您阅读某些内容之前,甚至在阅读完所有数据之后,才会出现EOF。
  • finished 变量是复制/粘贴错误,变量在我的代码中是一致的 isFinished 并且编译正常。
  • 在 for 循环中创建一些虚拟变量以将 fscanf %d 值分配给 fscanf 返回值,然后将它们打印出来,以及来自 fscanf 的数据就在 for循环,并附上该输出,请。另外,您是否多次调用此函数并期望它从以前的位置继续?

标签: c scanf feof


【解决方案1】:

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

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

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

【讨论】:

  • 如何查看返回值?将其与 NULL 进行比较?
  • @Dawson 打印出 fscanf 返回码,就像我在过去 30 分钟里一直要求你做的那样:-P
  • fscanf() 返回执行的分配数或EOF 以防文件提前结束或错误。使用该返回值:if (fscanf(...) != &lt;expected_value&gt;) /* something strange */;
  • 我不知道如何编码。我可以改用if (fscanf(f, "%*d %*d %*d\n")==EOF) 吗?这给了我同样的问题。
  • fscanf(f, "%*d %*d %*d\n") ????您为什么要尝试将 3 个值读入无处?如果您想读取(并丢弃)一行,请尝试fgets()
【解决方案2】:

不知道数据格式很难说,但是

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

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

试试:

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

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多