Можно ли читать с помощью fscanf до EOF?С - PullRequest
1 голос
/ 07 июня 2019

Я пишу функцию, которая читает имена, фамилии и номера из текстового файла и сохраняет их в структуре. Переменные в файле расположены следующим образом

Имя | Фамилия | Номер

Моя проблема в том, что у fscanf есть проблема с чтением последнего номера перед EOF.

Мой код:

int load_phonebook_t(const char *filename, struct entry_t* p, int size)
{
   int a,i,ilosc=0;
   FILE *fp;
   if(filename==NULL || p==NULL || size<1)
   {
      return -1;
   }    
   fp=fopen(filename,"r");
   if(fp==NULL)
   {
      return -2;
   }
   rewind(fp);
   for(i=0;i<size;i++)
   {
      if(i==size-1)
      {
         a=fscanf(fp,"%s | %s | %d[^EOF]",(p+i)->name,(p+i)->last_name,&(p+i)->number);
      }
      else
      {
         a=fscanf(fp,"%s | %s | %d",(p+i)->name,(p+i)->last_name,&(p+i)->number);
      }
      if(a==3)
      {
         ilosc++;
      }
   }
   fclose(fp);
   return ilosc;
}

Я пытался использовать fscanf (fp, "% s |% s |% d [^ EOF]"), но это не сработало. Мне нужна идея, как прекратить чтение до EOF или как правильно его прочитать.

Edit:

Последние несколько строк из моего .txt файла:

Annette | Bening | 378422705
George | C.Scott | 209747332
Burt | Lancaster | 568016673
Louis | Gossett Jr. | 528057525

1 Ответ

0 голосов
/ 07 июня 2019

Простая остановка в конце файла с помощью scanf.

a=fscanf(fp,"%s | %s | %d",(p+i)->name,(p+i)->last_name,&(p+i)->number);

if (a != 3) {
     /* handle eof; */
     break;
}

Есть много вещей, которые еще предстоит сделать, включая искаженные файлы и чтение файла один раз, когда вы увеличиваете массив, но, эй, детка, шаг за шагом. Вы также достигнете этого блока eof при любой ошибке ввода-вывода или форматирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...