[英]Create link list from text file
无法读取文本文件并将其存储在链接列表中。 我正在读取具有名字,名称,优先级和读取级别的文件。 我认为问题可能是我没有正确分配字符串/ tempPtr,或者我的循环不断运行。 运行该程序时,它将持续运行,没有段错误。
typedef struct Student{
char* firstName;
char* lastName;
int priority;
int readingLevel;
bookIds* wishlist;
struct Student* next;
}student;
student* buildStudentList(char* studentsFile, student* head)
{
int i;
FILE* fp;
student* tempPtr = NULL;
if((fp = fopen(studentsFile, "r")) == NULL)
{
printf("Unable to open file\n");
return 0;
}
student* current = NULL;
tempPtr = (student*)malloc(sizeof(student));
tempPtr->firstName = malloc(sizeof(char)* NAME);
tempPtr->lastName = malloc(sizeof(char)* NAME);
while(fscanf(fp, "%s %s %d %d",tempPtr->firstName, tempPtr->lastName, tempPtr->priority, tempPtr->readingLevel) != EOF)
{
tempPtr->next = NULL;
if(head == NULL)
{
head = tempPtr;
current = tempPtr;
tempPtr = (student*)malloc(sizeof(student));
}
else
{
current->next = tempPtr;
current = tempPtr;
tempPtr = (student*)malloc(sizeof(student));
}
}
free(tempPtr);
fclose(fp);
return head;
}
我建议您更改student
结构,以便firstName
和lastName
是数组而不是指针。 当它们总是相同大小时,就无需使用动态分配。
typedef struct Student{
char firstName[NAME];
char lastName[NAME];
int priority;
int readingLevel;
bookIds* wishlist;
struct Student* next;
}student;
接下来,无论何时分配新student
,都需要初始化wishList
和next
指向NULL
指针。
调用fscanf()
,需要将指针传递给您要填充的int
成员。
您可以通过仅在一个位置执行malloc()
而不是在循环之前执行,然后在if
每个分支中重复执行malloc()
来简化代码。 将输入读入局部变量,然后在成功后分配student
。
typedef struct Student{
char firstName[NAME];
char lastName[NAME];
int priority;
int readingLevel;
bookIds* wishlist;
struct Student* next;
}student;
student* buildStudentList(char* studentsFile, student* head)
{
int i;
FILE* fp;
if((fp = fopen(studentsFile, "r")) == NULL)
{
printf("Unable to open file\n");
return 0;
}
student* current = NULL;
char firstName[NAME], lastName[NAME];
int priority, readingLevel;
while(fscanf(fp, "%s %s %d %d",firstName, lastName, &priority, &readingLevel) != EOF)
{
student* tempPtr = malloc(sizeof(student));
tempPtr->next = NULL;
tempPtr->wishlist = NULL;
strcpy(tempPtr->firstName, firstName);
strcpy(tempPtr->lastName, lastName);
tempPtr->priority = priority;
tempPtr->readingLevel = readingLevel;
if(head == NULL)
{
head = tempPtr;
}
else
{
current->next = tempPtr;
}
current = tempPtr;
}
fclose(fp);
return head;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.