Я пытаюсь создать программу, которая создает структуру данных людей с их именами и идентификаторами. Когда я это компилирует, нет проблем, но когда он работает, я получаю ошибку сегментации (ядро сбрасывается). Файл находится в той же папке, что и файл .c. Кроме того, внутри файла данные будут разделены табуляцией. Функция list_create () создает структуру данных в виде списка.
Я попытался вместо создания одной строки кода со многими функциями, нескольких строк с несколькими функциями использовать tmp в качестве списка вместо узла, свободные переменные в другом порядке, но это ничего не изменило.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define MAXSTRING 50
typedef struct{
char name[MAXSTRING];
int id;
} student;
typedef struct _node* node;
typedef struct _list* list;
struct _node {
student data;
node next;
};
struct _list {
node head;
int size;
};
int list_empty(list l){
assert(l);
return l->head==NULL;
}
node list_deletefirst(list l){
assert(l && l->head);
node ret;
l->head=l->head->next;
l->size--;
ret->next=NULL;
return ret;
}
void list_freenode(node n){
assert(n);
free(n);
}
void load(char*filename,list l){
FILE *fd;
node tmp=l->head;
if((fd=fopen(filename,"r"))==NULL){
printf("Error trying to open the file");
abort();
}
else{
while(!feof(fd)){
fscanf(fd,"%s\t%d\n",tmp->data.name,&tmp->data.id);
tmp=tmp->next;
l->size++;
}
}
tmp->next=NULL;
fclose(fd);
}
void save(char *filename,list l){
int i;
node tmp=l->head;
FILE *fd;
rewind(fd);
if((fd=fopen(filename,"w"))==NULL){
printf("File could not be opened");
abort();
}
for(i=0;i<l->size;i++){
fprintf(fd,"%s\t%.4d\n",tmp->data.name,tmp->data.id);
tmp=tmp->next;
}
rewind(fd);
fclose(fd);
}
int main(int argc,char *argv[]){
list l=list_create();
load(argv[1],l);
save(argv[1],l);
while (!list_empty(l)){
list_freenode(list_deletefirst(l));
}
free(l);
return 0;
}
Я ожидаю получить список с именами и идентификаторами.