Прежде всего, вы сканируете 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 файлом в качестве ввода.