Передача fscanf в структуру - PullRequest
1 голос
/ 11 мая 2011

Я пытаюсь открыть файл и перейти к struct, я использую fscanf() с циклом, но он сохраняет только одну struct последнюю прочитанную:

Представьте себе файл:

JR John Rambo 24353432 
JL John Lennon 6435463

Я использую этот код:

* * 1010

Проблема в том, что он сохраняет только последнюю строку файла ... Должен ли я делать цикл if ??

Другой вопрос, как я могу отделить похожий файл, но с помощью ";"

Ответы [ 2 ]

5 голосов
/ 11 мая 2011

Прежде всего, вы сканируете 3 строки (%s) и одну целую (%d), когда передаете только 3 параметра в fscanf().Вы можете добавить char first_name[50]; в свой struct и затем сделать:

fscanf(fp,"%s %s %s %d\n", people[n_p].code,people[n_p].first_name,
         people[n_p].name, &people[n_p].telephone);

Вы всегда fscanf() файл, пока вам больше нечего читать (из-за !feof(fp) из-за времениТаким образом, в последней переменной people[n_p] будет сохранена последняя строка файла.

Вы можете удалить while из read(), а также добавить FILE * в качестве параметра функции, такчто вы не открываете файл каждый раз, когда звоните read().

Возможно, что-то вроде этого:

main()
{
   FILE* fp = fopen("example.txt", "r");
   int i = 0;

   while (!feof(fp)) {
       read(people, i, fp);
       i++;
   }
}

int read(PEOPLE people[], int n_p, FILE* fp){
   char temp;

   if(fp==NULL){
       printf("Error\n");
       return -1;
   }
   fscanf(fp,"%s %s %s %d\n", people[n_p].code,people[n_p].first_name, 
         people[n_p].name, &people[n_p].telephone);

}

Для использования ; в качестве разделителя вы можете изменить fscanf() к этому:

 fscanf(fp, "%[^;]; %[^;]; %d\n", people[n_p].code,people[n_p].name,
             &people[n_p].telephone);

РЕДАКТИРОВАТЬ Я написал приведенный выше код, который можно найти здесь , и он прекрасно работает с этим example.txt файлом в качестве ввода.

3 голосов
/ 11 мая 2011

Похоже, вы не меняете переменную n_p.Вам нужна какая-то переменная, чтобы отслеживать, какой индекс массива people [] вы обновляете.

Кроме того, мы надеемся, что у вас есть достаточно большой массив людей, чтобы вместить все записи в файле.

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