Я пытаюсь получить данные в свою структуру, теперь, когда я это делаю, в структуру попадает только первая строка файла.
Я предполагаю, что не знаю, сколько имен у меня в файле.
int InputData(student ** p_array, FILE * fp) {
student * arr;
int i = 1;`
if (!(arr = (student*)malloc(sizeof(student)))) {
printf("no");
_getch();
exit(1);
}
while (fscanf(fp, "%s %d %d %d", arr[i - 1].name, &arr[i - 1].grades[0], &arr[i - 1].grades[1], &arr[i - 1].grades[2]) != EOF) {
i++;
if (!(arr = (student*)realloc(arr, i*sizeof(student))))
{printf("no"); _getch(); exit(1); }
}
arr = (student*)realloc(arr, (i - 1) * sizeof(student));
*p_array = arr;
if (i = 1)
return (i); /*return the number of students*/
else
return (i - 1);
}
пример содержимого файла
Moshe 100 80 90
Dana 56 89 78
Maya 88 87 91
Adam 90 74 81
массив получает только эту строку
Moshe 100 80 90
пожалуйста, помогите мне исправить код.
хаха спасибо но не решил настоящую проблему
Вам нужно прочитать (и отбросить) символы конца строки в конце строк в файле. вы можете сделать это, включив хотя бы один пробел в конце спецификатора формата scanf.
Должно работать лучше, если вы немного упростите код:
int InputData(student **p_array, FILE *fp)
{
student *arr;
char buf[80];
int i = 0;
arr = (student *)malloc(sizeof(student));
if (!arr) {
printf("no");
_getch();
exit(1);
}
while (fscanf(fp, "%s %d %d %d", arr[i].name, &arr[i].grades[0], &arr[i].grades[1], &arr[i].grades[2]) != EOF) {
i++;
arr = (student *)realloc(arr, (i + 1) * sizeof(student));
if (!arr)
err(errno, "Failed realloc() array");
}
arr = (student *)realloc(arr, i * sizeof(student));
*p_array = arr;
return i; /* return number of students */
}
Утверждение
if (i = 1)
выглядит подозрительно, вы имели в видуif (i == 1)
? Эти ошибки трудно отследить, поэтому рекомендуется следовать хорошим практикам кодирования, таким какif (1 == i)