Проблема с односвязным списком и считыванием с файла в Си
Есть такая структура
typedef struct student {
char name[100];
int year;
float average;
struct student *next;
} STUDENT;
Которая позже используется в функции, которая по неизвестной причине не работает. По-сути там создается односвязный список, который возвращается:
STUDENT **readFromFile(char *file){
FILE *fr;
if((fr = fopen(file, "r")) == NULL) {
return NULL;
}
int count;
fscanf(fr, "%d", &count);
STUDENT **head = NULL;
for (int i = 0; i < count; i++) {
STUDENT *temporary = (STUDENT*)malloc(sizeof(STUDENT));
int j=0;
while ((temporary->name[j] = getchar()) != '\n') {
j++;
}
fscanf(fr, "%d", &temporary->year);
fscanf(fr, "%f", &temporary->average);
temporary->next=(*head);
(*head) = temporary;
}
fclose(fr);
return head;
}
После компиляции каждый раз неизвестные ошибки, которые я не понимаю. Помогите
Ответы (1 шт):
В основном ошибка использование указателя на указатель STUDENT **head = NULL;. После (*head) = temporary; произойдет запись в память по нулевому указателю и ошибка памяти. Поменяйте на обычный указатель STUDENT *head = NULL;.
Читаете буквы из консоли с помощью getchar. А надо из файла fgetc.
Потом при считывании имени забыли проставить конец строки temporary->name[j]='\00'; и проследить за переполнением из-за длинного имени.
typedef struct student {
char name[100];
int year;
float average;
struct student *next;
} STUDENT;
# include <stdio.h>
# include <stdlib.h>
STUDENT * readFromFile(char *file){
FILE *fr;
if((fr = fopen(file, "r")) == NULL) {
return NULL;
}
int count;
fscanf(fr, "%d", &count);
STUDENT * head = NULL ;
for (int i = 0; i < count; i++) {
STUDENT *temporary = (STUDENT*)malloc(sizeof(STUDENT));
int j=0;
while (j < 99 && (temporary->name[j] = fgetc(fr)) != '\n') {
j++;
}
temporary->name[j]='\00';
fscanf(fr, "%d", &temporary->year);
fscanf(fr, "%f", &temporary->average);
temporary->next=head;
head = temporary;
}
fclose(fr);
return head;
}