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

person Dawson    schedule 19.05.2013    source источник
comment
как вы ожидаете, что он обнаружит, закончился ли файл? Вы выполняете конечную серию вызовов fscanf на основе incan->ac-1, затем еще один, затем вызываете feof. Как это найдет конец файла? Он сообщит вам, если вы находитесь в конце, но каким-то образом не будет читать данные до конца, не так ли? Может быть, я что-то упускаю.   -  person xaxxon    schedule 19.05.2013
comment
почему бы вам не предоставить нам наименьший входной файл, который воспроизводит этот файл, и какой результат вы получите от этой программы на этом выходе по сравнению с тем, что вы ожидаете?   -  person xaxxon    schedule 19.05.2013
comment
У вас есть '\n' в последней строке? Таким образом, у вас должна быть последняя строка как пустая строка. В противном случае fscanf("...\n"); не будет правильно помещать значения в переменные.   -  person Rohan    schedule 19.05.2013
comment
Пожалуйста, не делайте двойной пост.   -  person likeitlikeit    schedule 20.05.2013


Ответы (1)


Я ожидаю, что в вашей программе будет цикл, похожий на:

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

если вы хотите определить, когда файл заканчивается.

person xaxxon    schedule 19.05.2013
comment
Это будет работать для сканирования до конца файла, но я хочу читать по одной строке за раз, как указано значением ac, а затем предпринимать действия, если эта прочитанная строка была последней. - person Dawson; 19.05.2013
comment
Так откуда вы знаете, что это одна строка раньше? - person xaxxon; 19.05.2013
comment
AC — это строка, которую я хочу прочитать, поэтому я пропускаю AC-1 и затем читаю правильную строку. - person Dawson; 19.05.2013
comment
это хорошо, но как узнать, что он проверяет eof == true на одну строку раньше? - person xaxxon; 19.05.2013
comment
Я протестировал программу, и последняя строка никогда не читается. - person Dawson; 19.05.2013
comment
определить никогда не читал? Это явно прочитано, иначе вы бы не получили EOF, так что оно как-то теряется. Вы также должны распечатать возвращаемое значение всех вызовов fscanf и распечатать их. - person xaxxon; 19.05.2013
comment
Спасибо, кажется, теперь я понял. - person Dawson; 19.05.2013
comment
Хорошо, дайте мне знать, что вы выяснили. Мне любопытно. - person xaxxon; 19.05.2013
comment
Я думаю, что проблема в том, что feof обнаруживает ложные окончания и увеличивает завершающее значение больше, чем следует. Циклы моей программы при завершении меньше определенного значения, поэтому некоторые строки никогда не читаются, так как программа завершается слишком рано. - person Dawson; 19.05.2013
comment
давайте продолжим это обсуждение в чате - person Dawson; 19.05.2013