Използване на fscanf за проверка дали съществуват още редове

Имам тази функция за четене на числа от txt файлове, които са структурирани така:

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 и грешки.:-) Връзка   -  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