程序功能比较复杂。主要问题是利用fopen_s打开文件且成功,但之后闪退了,后面写的程序都没运行。可以麻烦各位帮忙看看是什么问题吗
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1000
struct student
{
char id[20];
char name[50];
char department[50];
float gpa;
};
int read_data_from_file(struct student* students, int* num)
{
FILE* fp;
errno_t err;
err = fopen_s(&fp, "student_data.txt", "r");
if (err!=0)
{
printf("文件无法打开。\n");
system("pause");
exit(1);
}
else {
*num = 0;
while (*num < MAX && fscanf_s(fp, "%s%s%s%f", students[*num].id, students[*num].name, students[*num].department, &students[*num].gpa, sizeof(students[*num].id), sizeof(students[*num].name), sizeof(students[*num].department), sizeof(students[*num].gpa)) == 4)
{
(*num)++;
}
}
}
void display_menu()
{
printf("学生成绩查询系统");
printf("1.显示全部学生信息\n");
printf("2.按学号排序(升序/降序)\n");
printf("3.按绩点(gpa)排序(升序/降序)\n");
printf("4.按姓名查询\n");
printf("5.按学院查询\n");
printf("6.按gpa区间查询\n");
printf("7.各学院人数统计\n");
printf("8.EXIT\n");
printf("Enter your choice\n");
}
void display_students(struct student students[],int num)
{
printf("%15s%12s%32s%6s\n", "学号", "姓名", "学院", "GPA");
for (int i = 0;i < num;i++)
{
printf("%15s%12s%32s%6.1f\n", students[i].id, students[i].name, students[i].department, students[i].gpa);
}
}
void sort_by_id(struct student students[], int num, char order)
{
for (int i = 0;i < num - 1;i++)
{
for (int j = 0;j < num - i - 1;j++)
{
if (strcmp(students[j].id, students[j + 1].id) > order || (strcmp(students[j].id, students[j + 1].id)) == 0 && strcmp(students[j].department, students[j + 1].department) > order)
{
struct student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
void sort_by_gpa(struct student students[], int num, char order)
{
for (int i = 0;i < num-1;i++)
{
for (int j = 0;j < num-i-1;j++)
{
if (students[j].gpa > students[j + 1].gpa || (students[j].gpa == students[j + 1].gpa) && (strcmp(students[j].id, students[j + 1].id) > order))
{
struct student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
void query_by_name(struct student students[],int num)
{
char name[50];
printf("请输入要查找的姓名:\n");
for (int i = 0;i < num;i++)
{
if (strcmp(students[i].name, name) == 0)
{
printf("学号:%s\n姓名:%s\n学院:%s\nGPA:%.2f\n", students[i].id, students[i].name, students[i].department, students[i].gpa);
}
}
}
void query_by_gparange(struct student students[], int num)
{
float gpa_start, gpa_end;
printf("请输入要查询的gpa区间:\n");
scanf_s("%f %f", &gpa_start, &gpa_end);
for (int i = 0;i < num;i++)
{
if (students[i].gpa >= gpa_start && students[i].gpa <= gpa_end)
{
printf("学号:%s\n姓名:%s\n学院:%s\nGPA:%.2f\n", students[i].id, students[i].name, students[i].department, students[i].gpa);
}
}
}
void query_by_department(struct student students[], int num)
{
char department[50];
printf("请输入要查找的学院:\n");
scanf_s("%s", department);
for (int i = 0;i < num;i++)
{
if (strcmp(students[i].department, department) == 0)
{
printf("学号:%s\n姓名:%s\n学院:%s\nGPA:%.2f\n", students[i].id, students[i].name, students[i].department, students[i].gpa);
}
}
}
void sum_department(struct student students[], int num)
{
int department_count[MAX] = { 0 };
for (int i = 0;i < num;i++)
{
for (int j = 0;i < num;j++)
{
if (strcmp(students[i].department, students[j].department) == 0)
{
department_count[i]++;
}
}
}
for (int i = 0;i < num;i++)
{
printf("学院:%s人数:%d\n", students[i].department, department_count);
}
}
int main(void)
{
struct student students[MAX];
int num = 0;
read_data_from_file(students,&num);
int select;
char order;
do {
display_menu();
scanf_s("%d", &select);
switch (select)
{
case 1:
display_students(students, num);
break;
case 2:
printf("输入'a'升序排列,输入'd'降序排列:");
scanf_s("%c", &order);
sort_by_id(students, num, order);
printf("\n按学号排序(in %s order):\n", order = 'a');
display_students(students, num);
break;
case 3:
printf("输入'a'升序排列,输入'd'降序排列:");
scanf_s("%c", &order);
sort_by_gpa(students, num, order);
printf("\n按gpa排序(in %s order):\n", order = 'a');
display_students(students, num);
break;
case 4:
query_by_name(students, num);break;
case 5:
query_by_department(students, num);break;
case 6:
query_by_gparange(students, num);break;
case 7:
sum_department(students, num);break;
case 8:printf("退出系统\n");break;
default:printf("无效选择!请重新输入\n");break;
}
} while (select != 8);
getch();
return 0;
}