Использование fscanf для проверки наличия дополнительных строк

У меня есть эта функция для чтения чисел из текстовых файлов, которые структурированы следующим образом:

1 2 5
2 1 9
3 5 8

Функция правильно считывает значения в мои значения, но я хочу проверить, является ли строка, которую я прочитал, последней в файле.

Мой последний оператор if в приведенной ниже функции пытается сделать это, наблюдая, выдает ли fscanf NULL, но это не работает, функция всегда возвращает NULL, даже если это не последняя строка.

 void process(int lineNum, char *fullName)
      {
        int ii, num1, num2, num3;

        FILE* f; 
        f = fopen(fullName, "r");

        if(f==NULL) 
          {
          printf("Error: could not open %S", fullName);
          }

        else
        {
        for (ii=0 (ii = 0; ii < (lineNum-1); ii++)
          {
          /*move through lines without scanning*/
          fscanf(f, "%d %d %d", &num1, &num2, &num3);
          }

        if (fscanf(f, "%*d %*d %*d\n")==NULL)
            {
            printf("No more lines");
            }

        fclose(f);

        }
      }

person Dawson    schedule 15.05.2013    source источник
comment
проверьте мой код тоже пользователь :)   -  person Chiradeep    schedule 15.05.2013
comment
вы должны были проверить свой предыдущий пост, я дал вам ответ с обнаружением EOF и ошибками. :-) Link   -  person Koushik Shetty    schedule 15.05.2013


Ответы (2)


Вы можете использовать feof(), чтобы проверить, читаете ли вы конец файла.

Со страницы руководства fscanf:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ Эти функции возвращают количество успешно сопоставленных и назначенных входных элементов, которое может быть меньше предусмотренного или даже равно нулю в случае неудачи раннего сопоставления.

Вы, если последняя строка, которую вы пытаетесь прочитать, не соответствует ожидаемому формату, fscanf может ничего не прочитать и вернуть 0, что совпадает с NULL.

person Rohan    schedule 15.05.2013
comment
Спасибо, у меня сработал feof: if (feof(f)) { printf(Больше строк\n); } - person Dawson; 15.05.2013
comment
-1 НЕТ -- feof говорит только о том, пытались ли вы прочитать ПОСЛЕ конца файла. Если вы точно прочитали весь файл, но вызов чтения еще не завершился ошибкой, feof вернет false. - person Chris Dodd; 15.05.2013

Проверьте этот код ниже. Используя этот код, вы можете увидеть, достигли ли вы конца файла или нет. Не рекомендуется использовать fscanf для чтения конца файла.

/* пример feof: счетчик байтов */

#include <stdio.h>

 int main ()
{
 FILE * pFile;
 int n = 0;
 pFile = fopen ("myfile.txt","r");
 if (pFile==NULL) perror ("Error opening file");
 else
  {
   while (fgetc(pFile) != EOF) {
  ++n;
  }
 if (feof(pFile)) {
  puts ("End-of-File reached.");
  printf ("Total number of bytes read: %d\n", n);
  }
 else puts ("End-of-File was not reached.");
  fclose (pFile);
}
return 0;
}
person Chiradeep    schedule 15.05.2013