(学生成绩管理系统链表版)应该是文件读写的问题,第一次录入信息可以写入文件,但再次运行时无法读取之前写入的文件,
且会弹出“Debug error”的框,求问哪里出错了,谢谢
点击忽略以后不影响程序运行
可以输入信息,且写入了文件
但关闭文件后,再次运行程序,显示如下
无法读取之前写入的信息,程序也无法
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//创建学生信息结构体
struct student
{
char ID[20]; //学号
char name[20]; //姓名
int math; //高数成绩
int english; //英语成绩
int eletric; //电路成绩
int c_program; //C语言成绩
float sum; //总分
float aver; //平均分
};
//链式管理系统
struct Node
{
struct student data;
struct Node* next;
};
//创建表头,表示整个链表
struct Node* CreateList()
{
struct Node* head = (struct Node*)malloc(sizeof(struct Node));
head->next = NULL;
return head;
}
//创建结点
struct Node* CreateNode(struct student data)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
//插入操作
void insertNode(struct Node* head, struct student data)
{
//创建插入结点
struct Node* newNode = CreateNode(data);
newNode->next = head->next;
head->next = newNode;
}
//删除操作
void deleteNode(struct Node* head, char *pID)
{
struct Node* cur, * prev;
for (cur = head, prev = NULL;cur != NULL && strcmp(cur->data.ID, pID) != 0;prev = cur, cur = cur->next);
if (cur == NULL)
{
printf("未找到相关数据\n");
system("pause");
return;
}
if (prev == NULL)
head = head->next;
else
prev->next = cur->next;
free(cur);
return;
}
//打印操作
void printList(struct Node* head)
{
//从第二个结点开始打印
struct Node* p = head->next;
printf("学号\t姓名\t高数\t英语\t电路\tC语言\t总分\t平均分\n");
while (p)
{
printf("%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n",p->data.ID, p->data.name, p->data.math, p->data.english, p->data.eletric, p->data.c_program, p->data.sum, p->data.aver);
p = p->next;
}
printf("\n");
}
//按照平均分进行排序(冒泡排序法)
void sort(struct Node* head)
{
struct Node* p, * pstart, * pend, * temp, * pre;
p = head->next; pend = head;
pstart = (struct Node*)malloc(sizeof(struct Node));
pstart->next = head;
while (p != NULL)
{
temp = pstart->next, pre = pstart;
while (temp != p && p->data.aver >= temp->data.aver)
{
temp = temp->next;
pre = pre->next;
}
if (temp == p)
pend = p;
else
{
pend->next = p->next;
p->next = temp;
pre->next = p;
}
p = pend->next;
}
head = pstart->next;
free(pstart);
return;
}
//链表的文件操作
//链表的读文件操作
void readInfo(struct Node* head, char* fileName)
{
FILE* read = fopen(fileName, "r");
if (read == NULL)
read = fopen(fileName, "w+");
struct student data;
while (fscanf(read, "%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n",
data.ID, data.name, data.math, data.english, data.eletric, data.c_program, data.sum, data.aver) != EOF)
insertNode(head, data);
fclose(read);
}
//链表的写文件操作
void writeInfo(struct Node* head, char *fileName)
{
FILE* write = fopen(fileName, "w");
struct Node* p = head->next;
while (p)
{
fprintf(write, "%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n",
p->data.ID, p->data.name, p->data.math, p->data.english, p->data.eletric, p->data.c_program, p->data.sum, p->data.aver);
p = p->next;
}
fclose(write);
}
//菜单项目
void menu()
{
printf("--------------学生成绩管理系统------------------\n");
printf("\t\t0.退出系统\n");
printf("\t\t1.录入信息\n");
printf("\t\t2.浏览信息\n");
printf("\t\t3.删除信息\n");
printf("\t\t4.修改信息\n");
printf("\t\t5.成绩排序\n");
printf("------------------------------------------------\n");
}
struct Node* studentList = CreateList();
//按键交互
void keydown()
{
int userkey = 0;
printf("请输入指令的相应序号:\n");
scanf("%d", &userkey);
struct student userData;
switch (userkey)
{
case 0:
printf("--------------【退出系统】---------------\n");
printf("正常退出\n");
system("pause");
exit(0);
break;
case 1:
printf("--------------【录入信息】---------------\n");
printf("请输入以下学生信息:\n");
printf("学号\t姓名\t高数\t英语\t电路\tC语言\n");
scanf("%s%s%d%d%d%d", userData.ID, userData.name, &userData.math, &userData.english, &userData.eletric, &userData.c_program);
userData.sum = userData.math + userData.eletric + userData.c_program + userData.english;
userData.aver = (userData.sum) / 4;
insertNode(studentList, userData);
break;
case 2:
printf("--------------【浏览信息】---------------\n");
printList(studentList);
break;
case 3:
printf("--------------【删除信息】---------------\n");
printf("请输入需要删除的学生学号:\n");
scanf("%s", userData.ID);
deleteNode(studentList, userData.ID);
break;
case 4:
printf("--------------【修改信息】---------------\n");
printf("请输入需要修改的学生学号:\n");
scanf("%s", userData.ID);
deleteNode(studentList, userData.ID);
printf("请重新输入以下学生信息:\n");
printf("学号\t姓名\t高数\t英语\t电路\tC语言\n");
scanf("%s%s%d%d%d%d", userData.ID, userData.name, &userData.math, &userData.english, &userData.eletric, &userData.c_program);
userData.sum = userData.math + userData.eletric + userData.c_program + userData.english;
userData.aver = (userData.sum) / 4;
insertNode(studentList, userData);
printf("修改成功!\n");
break;
case 5:
printf("--------------【成绩排序】---------------\n");
sort(studentList);
printList(studentList);
break;
default:printf("输入错误,请重新输入\n");
break;
}
}
int main()
{
readInfo(studentList, "studentInfo.txt");
while (1)
{
menu();
keydown();
writeInfo(studentList, "studentInfo.txt");
system("pause");
system("cls");
}
system("pause");
return 0;
}