C feof()在实际结束前一行检测文件结束

C feof()在实际结束前一行检测文件结束,c,scanf,feof,C,Scanf,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")

我有一个函数,可以读取文件并检测文件何时结束

函数当前只读取最后一行的第二行并结束。谁能告诉我我做错了什么,因为我自己都看不出来:

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;
  }
int readIn(TinCan*印加,int切换)
{
int ii,isFinished=0;
字符全名[20];
sprintf(全名,“Label_u%d.txt”,印加->pid);
文件*fp;
fp=fopen(全名,“r”);
如果(fp==NULL)
{
printf(“错误:无法打开%s\n”,全名);
}
其他的
{
对于(ii=0;ii<((印加->交流)-1);ii++)
{
fscanf(fp,“%*d%*d%*d\n”);/*在不扫描的情况下通过行移动*/
}
fscanf(fp,“%d%d%d”,&inca->ac,&inca->state,&inca->time);
}
if(feof(fp)&(toggle==1))
{
printf(“文件结束”);
writeLog(印加);
isFinished=1;
终止++;
}
fclose(fp);
返回完成;
}

我希望您的程序中有一个类似以下内容的循环:

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

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

我希望您的程序中有一个类似以下内容的循环:

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


如果要检测文件何时结束。

您希望它如何检测文件是否结束?您根据
inca->ac-1
执行一系列有限的fscanf调用,然后再执行一次,然后调用feof。如何找到文件的结尾?它会告诉你是否到了最后,但它在eof之前不会读取数据,是吗?也许我遗漏了什么。为什么不给我们一个复制这个文件的最小的输入文件,以及你从这个程序中得到的输出与你期望的相比呢?最后一行有
'\n'
?所以最后一行应该是空行。否则
fscanf(“…\n”)
不会将值适当地放入变量中。请不要重复发布。您希望它如何检测文件是否已结束?您根据
inca->ac-1
执行一系列有限的fscanf调用,然后再执行一次,然后调用feof。如何找到文件的结尾?它会告诉你是否到了最后,但它在eof之前不会读取数据,是吗?也许我遗漏了什么。为什么不给我们一个复制这个文件的最小的输入文件,以及你从这个程序中得到的输出与你期望的相比呢?最后一行有
'\n'
?所以最后一行应该是空行。否则
fscanf(“…\n”)
将不会将值适当地放入变量中。请不要重复发布。这将在文件结束前进行扫描,但我希望按照ac值指定的时间一次读取一行,然后在该行读取为最后一行时采取措施。那么,您如何知道这一行太早了?ac是我要读取的行,所以我跳过AC-1,然后读正确的一行。这很好,但是你怎么知道它测试eof==真的太早了一行?定义从不读?很明显,它已经读过了,否则你就得不到EOF了,所以它不知怎么地丢失了。您还应该打印出所有fscanf调用的返回值并打印出来。这样可以一直扫描到文件末尾,但我希望按照ac值指定的时间一次读取一行,然后在该行读取为最后一行时采取措施。那么,您如何知道这一行太早了?ac是我要读取的行,所以我跳过AC-1,然后读正确的一行。这很好,但是你怎么知道它测试eof==真的太早了一行?定义从不读?很明显,它已经读过了,否则你就得不到EOF了,所以它不知怎么地丢失了。您还应该打印出所有fscanf调用的返回值并打印出来。