#c
#c
Вопрос:
Я пытаюсь получить данные в свою структуру, теперь, когда я это делаю, в структуру попадает только первая строка файла.
Я предполагаю, что я не знаю, сколько имен у меня в файле.
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, amp;arr[i - 1].grades[0], amp;arr[i - 1].grades[1], amp;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
пожалуйста, помогите мне исправить код.
Комментарии:
1. Вы имели в виду, что это утверждение
if (i = 1)
выглядит подозрительноif (i == 1)
? Эти ошибки трудно отследить, поэтому предлагается следовать хорошим методам кодирования, таким какif(1 == i)
2. хахах спасибо, но не решило актуальную проблему
3. Вам нужно прочитать (и отбросить) символы конца строки в конце строк в файле. вы можете сделать это, включив по крайней мере один пробел в конце спецификатора формата scanf.
Ответ №1:
Должно работать лучше, если вы немного упростите код:
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, amp;arr[i].grades[0], amp;arr[i].grades[1], amp;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 */
}