首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >feof检测文件的错误结尾

feof检测文件的错误结尾
EN

Stack Overflow用户
提问于 2013-05-19 16:48:59
回答 2查看 1.3K关注 0票数 0

我之前问了一个不同的问题,但我对这个问题大错特错,所以我创建了一个新问题,因为我问的是一个完全不同的问题。

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

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

代码语言:javascript
复制
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;
  }

样本数据按要求,这是一个我可能使用的文本文件:

代码语言:javascript
复制
1 1 30
2 2 5
3 1 1

fscanf正确地赋值。在第二行,feof返回true,terminated递增。对于第三行,feof再次返回true,并且递增第二次终止。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-19 17:03:18

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

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

因此,首先读取数据并检查返回值。如果读取失败,请使用feof()确保由于到达文件末尾而失败(读取失败的其他原因是某种类型的错误(网络关闭、坏扇区、打印机着火等),可用ferror()检测到)。

票数 1
EN

Stack Overflow用户

发布于 2013-05-19 17:14:54

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

代码语言:javascript
复制
 fscanf(fp,"%d %d %d", &inCan->ac, &inCan->state, &inCan->time); 

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

尝试:

代码语言:javascript
复制
 fscanf(fp,"%d %d %d\n", &inCan->ac, &inCan->state, &inCan->time);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16632889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档