问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
以下为完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void menu()
{
printf("|---------------------------------------|\n");
printf("|\t XXX学生成绩管理系统 |\n");
printf("|---------------------------------------|\n");
printf("|\t请选择功能菜单,按0退出程序: |\n");
printf("|---------------------------------------|\n");
printf("|\t1、从文件中导入原始数据 |\n");
printf("|---------------------------------------|\n");
printf("|\t2、添加学生信息 |\n");
printf("|---------------------------------------|\n");
printf("|\t3、删除学生信息 |\n");
printf("|---------------------------------------|\n");
printf("|\t4、统计每位同学的平均分 |\n");
printf("|---------------------------------------|\n");
printf("|\t5、统计每门课程的平均分 |\n");
printf("|---------------------------------------|\n");
printf("|\t6、分段统计人数 |\n");
printf("|---------------------------------------|\n");
printf("|\t7、查询学生 |\n");
printf("|---------------------------------------|\n");
printf("|\t8、报表输出 |\n");
printf("|---------------------------------------| \n");
}
struct student
{
char num[30];
char name[20];
int score[3];
};
struct node
{
struct student date;
struct node* next;
};
struct node* creatlist()
{
struct node* headnode = (struct node*)malloc(sizeof(struct node*));
headnode->next = NULL;
return headnode;
}
struct node* creatnode(struct student date)
{
struct node* newnode = (struct node*)malloc(sizeof(struct node*));
newnode->date = date;
newnode->next = NULL;
return newnode;
}
void insertnode(struct node* headnode, struct student date)
{
struct node* newnode = creatnode(date);
newnode->next = headnode->next;
headnode->next = newnode;
}
void findnode(struct node* headnode, char* num)
{
struct node* posnodefront = headnode;
struct node* posnode = headnode->next;
if (posnode == NULL)
{
printf("no find\n");
}
else
{
while (strcmp(posnode->date.num, num))
{
posnodefront = posnode;
posnode = posnodefront->next;
if (posnode == NULL)
{
printf("no found\n");
}
}
printf("学号:%s\t姓名:%s\t高数成绩:%d\tC语言成绩:%d\t英语成绩:%d\t", posnode->date.num, posnode->date.name, posnode->date.score[0], posnode->date.score[1], posnode->date.score[2]);
printf("\n");
}
}
void deletenode(struct node* headnode, char* num)
{
struct node* posnodefront = headnode;
struct node* posnode = headnode->next;
if (posnode == NULL)
{
printf("no find\n");
}
else
{
while (strcmp(posnode->date.num, num))
{
posnodefront = posnode;
posnode = posnodefront->next;
if (posnode == NULL)
{
printf("no found\n");
}
}
posnodefront->next = posnode->next;
posnode = NULL;//不加这个会报错野指针
free(posnode);
printf("delete\n");
}
}
void printlist(struct node* headnode)
{
struct node* pmove = headnode->next;
while (pmove)
{
printf("学号:%s\t姓名:%s\t高数成绩:%d\tC语言成绩:%d\t英语成绩:%d\t", pmove->date.num, pmove->date.name, pmove->date.score[0], pmove->date.score[1], pmove->date.score[2]);
printf("\n");
pmove = pmove->next;
}
}
void stuaver(struct node* headnode, struct student date)
{
struct node* pmove = headnode->next;
while (pmove)
{
int sum = 0;
float aver;
sum = pmove->date.score[0] + pmove->date.score[1] + pmove->date.score[2];
aver = sum / 3.0;
printf("%s的平均分=%f\n", pmove->date.name, aver);
pmove = pmove->next;
}
}
void courseaver(struct node* headnode, struct student date)
{
int sum1 = 0, sum2 = 0, sum3 = 0, count = 0;
struct node* pmove = headnode->next;
while (pmove)
{
sum1 += pmove->date.score[0];
sum2 += pmove->date.score[1];
sum3 += pmove->date.score[2];
count++;
pmove = pmove->next;
}
float aver1 = float(sum1) / count;
float aver2 = float(sum2) / count;
float aver3 = float(sum3) / count;
printf("高数平均分=%f\nC语言平均分=%f\n英语平均分=%f\n", aver1, aver2, aver3);
}
void readlistfromfile(struct node* headnode)
{
FILE* fp;
fp = fopen("C:\\Users\\ligang\\source\\repos\\Project6\\Project6\\filename.txt","r");
if (fp == NULL)
{
printf("文件打开失败\n");
}
else
{
printf("文件打开成功\n");
struct student date = {0,0,0,0,0};
do
{
fscanf(fp, "%s%s%d%d%d", date.num, date.name, &date.score[0], &date.score[1], &date.score[2]);
insertnode(headnode, date);
} while (!feof(fp));
}
rewind(fp);
fclose(fp);
}
void savelistfromfile(struct node* headnode)
{
FILE* fp;
fp = fopen("C:\\Users\\ligang\\source\\repos\\Project6\\Project6\\filename.txt", "w");
struct node* pmove=headnode->next ;
while (pmove)
{
fprintf(fp, "%s\r\n%s\r\n%d\r\n%d\r\n%d\r\n", pmove->date.num, pmove->date.name, pmove->date.score[0], pmove->date.score[1], pmove->date.score[2]);
pmove = pmove->next;
}
fclose(fp);
}
struct node* list = creatlist();
int main()
{
struct student date = {0,0,0,0,0};
menu();
int a;
do {
printf("请输入功能键\n");
scanf("%d", &a);
switch (a)
{
case 0:printf("[你退出了程序]\n"); break;
case 1: {printf("[从文件中导入原始数据]\n");
readlistfromfile(list);
printlist(list);
break; }
break;
case 2: {printf("[添加学生信息]\n");
printf("请输入学生信息\n");
printf("学号\t 姓名\t 高数成绩\t C语言成绩\t 英语成绩\n");
scanf("%s%s%d%d%d", date.num, date.name, &date.score[0], &date.score[1], &date.score[2]);
insertnode(list, date);
break; }break;
case 3: {printf("[删除学生]\n");
printf("请输入要删除学生的学号\n");
scanf("%s", date.num);
deletenode(list, date.num);
break; } break;
case 4: {printf("[统计每位同学的平均分]\n");
stuaver(list, date);
break; } break;
case 5: {printf("[统计每门课程的平均分]\n");
courseaver(list, date);
break; } break;
case 6:printf("[分段统计人数]\n"); break;
case 7: {printf("[查询学生]\n");
printf("请输入要查找学生的学号\n");
scanf("%s", date.num);
findnode(list, date.num);
break; } break;
case 8: {printf("[报表输出]\n");
printlist(list);
break; }break;
default:printf("[error]\n");
}
} while (a != 0);
savelistfromfile(list);
return 0;
}
########
以下为文件内的内容
202211105
小强
98
98
98
202211101
小华
98
98
98
202211102
小红
98
98
98
202211103
小蓝
98
98
98
202211109
小金
98
98
98
运行结果及报错内容
运行到某一功能就停止了
我的解答思路和尝试过的方法
应该是文件导入和写入有问题
我想要达到的结果
让程序正常运行,能够成功读取和写入文件。