【问题标题】:feof() detecting end of file one line before actual end [duplicate]feof()在实际结束前一行检测文件结束[重复]
【发布时间】:2013-05-19 08:10:50
【问题描述】:

我有一个函数应该读取文件并检测文件何时结束。

该函数当前仅读取倒数第二行并结束。谁能告诉我我做错了什么,因为我自己看不到:

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;
  }

【问题讨论】:

  • 您希望它如何检测文件是否已结束?您基于incan-&gt;ac-1 执行一系列 fscanf 调用,然后再调用一个,然后调用 feof。那将如何找到文件的结尾?它会告诉你你是否在最后,但它不会以某种方式读取数据,直到 eof,是吗?也许我错过了什么。
  • 你为什么不给我们最小的输入文件来重现这个文件,以及你从这个程序得到的输出与你期望的输出相比?
  • 最后一行有'\n' 吗?所以你应该把最后一行作为空行。否则fscanf("...\n"); 不会将值适当地放入变量中。
  • 请勿重复发帖。

标签: c scanf feof


【解决方案1】:

我希望您的程序中包含类似于以下内容的循环:

while (!feof(fp)) {
...
    fscanf(fp, "%*d %*d %*d\n");
...
}

如果你想检测文件何时结束。

【讨论】:

  • 这将适用于扫描到文件末尾,但我想按照 ac 值的指定一次读取一行,然后在读取的那一行是最后一行时采取行动。跨度>
  • 那你怎么知道这行太早了?
  • ac是我想读的那一行,所以我跳过AC-1然后读正确的那一行。
  • 这很好,但你怎么知道它测试 eof == true 为时过早?
  • 定义从未读过?它显然已被读取,否则您将不会得到 EOF,因此它会以某种方式丢失。您还应该打印出所有 fscanf 调用的返回值并将其打印出来。
猜你喜欢
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多