чтение из файла в структуру записывает только первую структуру в массиве

#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 */
}