fp = fopen("teacher.txt","r"))== NULL
时间: 2023-07-06 11:03:54 浏览: 85
这段代码中,有一个错误。应该将 "== NULL" 放在外面的括号之后,即应该写成:
```
fp = fopen("teacher.txt", "r");
if (fp == NULL) {
// 处理文件打开失败的情况
}
```
这是因为 fopen 函数返回的是一个文件指针,如果文件打开失败,该指针会被赋值为 NULL。因此需要在打开文件之后,检查文件指针是否为 NULL,以判断文件是否打开成功。
相关问题
void basicSettings(struct Student* student, struct Course courses[], int* numCourses) { int choose; printf("\n--------基本设置--------\n"); printf("\n--------1.添加学生信息--------\n"); printf("\n--------2.添加老师信息--------\n"); printf("\n--------3.修改密码--------\n"); printf("\n--------4.返回--------\n"); printf("请输入您的选择:\n"); scanf("%d", &choose); if(choose==1){ printf("\n"); printf("请输入班级:"); scanf("%s", student->className); printf("请输入学号:"); scanf("%s", student->id); printf("请输入姓名:"); scanf("%s", student->name); } if(choose==2) { printf("\n"); printf("请输入课程数:"); scanf("%d", numCourses); printf("请输入每门课程的名称和教师名字:\n"); for (int i = 0; i < *numCourses; i++) { printf("第%d门课程:", i + 1); scanf("%s %s", courses[i].name, courses[i].teacher); } } if(choose==3) { void changePassword(struct User* user) { printf("\n--------修改密码--------\n"); printf("请输入旧密码:"); char oldpassword[MAX_NAME_LEN]; scanf("%s", oldpassword); if (strcmp(oldpassword, user->password) != 0) { printf("密码错误,修改失败!\n"); return; } printf("请输入新密码:"); scanf("%s", user->password); printf("密码已修改!\n"); } changePassword(user_p); } FILE* fp = fopen("student.dat", "wb"); if (fp == NULL) { printf("无法打开文件!\n"); return; } fwrite(student, sizeof(struct Student), 1, fp); fclose(fp); fp = fopen("courses.dat", "wb"); if (fp == NULL) { printf("无法打开文件!\n"); return; } fwrite(courses, sizeof(struct Course), *numCourses, fp); fclose(fp); printf("设置已保存!\n"); } 修改代码
在函数basicSettings中,我发现有一个内嵌的函数changePassword。这个函数的定义在if(choose==3)的条件下,最好将其定义移到函数basicSettings的外面,避免出现嵌套函数的情况。同时,在函数内部,应该检查文件是否成功打开,如果打开失败,应该返回错误信息。修改后的代码如下:
```
void changePassword(struct User* user) {
printf("\n--------修改密码--------\n");
printf("请输入旧密码:");
char oldpassword[MAX_NAME_LEN];
scanf("%s", oldpassword);
if (strcmp(oldpassword, user->password) != 0) {
printf("密码错误,修改失败!\n");
return;
}
printf("请输入新密码:");
scanf("%s", user->password);
printf("密码已修改!\n");
}
void basicSettings(struct Student* student, struct Course courses[], int* numCourses) {
int choose;
printf("\n--------基本设置--------\n");
printf("\n--------1.添加学生信息--------\n");
printf("\n--------2.添加老师信息--------\n");
printf("\n--------3.修改密码--------\n");
printf("\n--------4.返回--------\n");
printf("请输入您的选择:\n");
scanf("%d", &choose);
if (choose == 1) {
printf("\n");
printf("请输入班级:");
scanf("%s", student->className);
printf("请输入学号:");
scanf("%s", student->id);
printf("请输入姓名:");
scanf("%s", student->name);
}
if (choose == 2) {
printf("\n");
printf("请输入课程数:");
scanf("%d", numCourses);
printf("请输入每门课程的名称和教师名字:\n");
for (int i = 0; i < *numCourses; i++) {
printf("第%d门课程:", i + 1);
scanf("%s %s", courses[i].name, courses[i].teacher);
}
}
if (choose == 3) {
changePassword(user_p);
}
FILE* fp = fopen("student.dat", "wb");
if (fp == NULL) {
printf("无法打开学生文件!\n");
return;
}
fwrite(student, sizeof(struct Student), 1, fp);
fclose(fp);
fp = fopen("courses.dat", "wb");
if (fp == NULL) {
printf("无法打开课程文件!\n");
return;
}
fwrite(courses, sizeof(struct Course), *numCourses, fp);
fclose(fp);
printf("设置已保存!\n");
}
```
请用C语言设计学生信息管理系统: 1,系统启动后从数据文件中将数据导入到程序中。其中学生成绩表文件“report.txt”已给出。 2,具有显示学生成绩表功能,成绩表表头:学号、姓名、专业、C语言、计算物理、大学物理、原子物理、光学。 3,设计管理员,教师,学生三个身份,管理员界面可以对教师,学生身份进行管理;教师界面可以录入、修改、添加和删除学生成绩,并且可以查询统计学生成绩;学生界面可以查询学生单科成绩和总成绩。显示和查询成绩调用report.txt中的内容,管理员界面和教师界面对学生成绩编辑直接编辑report.txt中的内容
好的,这是一个比较复杂的项目,需要多个模块来完成。先给出主要的模块设计,具体实现可以参考下面的代码。
1. 学生信息结构体
```
typedef struct {
char id[10]; // 学号
char name[20]; // 姓名
char major[10]; // 专业
float c_lang; // C语言成绩
float compute_physics; // 计算物理成绩
float uni_physics; // 大学物理成绩
float atomic_physics; // 原子物理成绩
float optics; // 光学成绩
} student;
```
2. 数据导入模块
```
void load_data(student *stu_arr, int *stu_cnt) {
FILE *fp = fopen("report.txt", "r");
if (fp == NULL) {
printf("Failed to open file report.txt\n");
return;
}
while (fscanf(fp, "%s %s %s %f %f %f %f %f", stu_arr[*stu_cnt].id, stu_arr[*stu_cnt].name, stu_arr[*stu_cnt].major, &stu_arr[*stu_cnt].c_lang, &stu_arr[*stu_cnt].compute_physics, &stu_arr[*stu_cnt].uni_physics, &stu_arr[*stu_cnt].atomic_physics, &stu_arr[*stu_cnt].optics) == 8) {
(*stu_cnt)++;
}
fclose(fp);
}
```
3. 显示成绩表模块
```
void show_score_table(student *stu_arr, int stu_cnt) {
printf("%-10s%-20s%-10s%-10s%-10s%-15s%-15s%-10s\n", "学号", "姓名", "专业", "C语言", "计算物理", "大学物理", "原子物理", "光学");
for (int i = 0; i < stu_cnt; i++) {
printf("%-10s%-20s%-10s%-10.2f%-15.2f%-15.2f%-15.2f%-10.2f\n", stu_arr[i].id, stu_arr[i].name, stu_arr[i].major, stu_arr[i].c_lang, stu_arr[i].compute_physics, stu_arr[i].uni_physics, stu_arr[i].atomic_physics, stu_arr[i].optics);
}
}
```
4. 教师管理模块
```
void teacher_manage(student *stu_arr, int stu_cnt) {
int choice;
while (1) {
printf("请选择操作:\n");
printf("1. 录入学生成绩\n");
printf("2. 修改学生成绩\n");
printf("3. 添加学生成绩\n");
printf("4. 删除学生成绩\n");
printf("5. 查询统计学生成绩\n");
printf("0. 返回主菜单\n");
scanf("%d", &choice);
switch (choice) {
case 1:
// 录入学生成绩
break;
case 2:
// 修改学生成绩
break;
case 3:
// 添加学生成绩
break;
case 4:
// 删除学生成绩
break;
case 5:
// 查询统计学生成绩
break;
case 0:
// 返回主菜单
return;
default:
printf("无效的选项!\n");
break;
}
}
}
```
5. 学生查询模块
```
void student_query(student *stu_arr, int stu_cnt) {
int choice;
while (1) {
printf("请选择查询方式:\n");
printf("1. 查询单科成绩\n");
printf("2. 查询总成绩\n");
printf("0. 返回主菜单\n");
scanf("%d", &choice);
switch (choice) {
case 1:
// 查询单科成绩
break;
case 2:
// 查询总成绩
break;
case 0:
// 返回主菜单
return;
default:
printf("无效的选项!\n");
break;
}
}
}
```
6. 管理员界面
```
void admin_interface(student *stu_arr, int stu_cnt) {
int choice;
while (1) {
printf("请选择身份:\n");
printf("1. 管理员\n");
printf("2. 教师\n");
printf("3. 学生\n");
printf("0. 退出程序\n");
scanf("%d", &choice);
switch (choice) {
case 1:
// 管理员界面
break;
case 2:
// 教师管理
teacher_manage(stu_arr, stu_cnt);
break;
case 3:
// 学生查询
student_query(stu_arr, stu_cnt);
break;
case 0:
// 退出程序
return;
default:
printf("无效的选项!\n");
break;
}
}
}
```
这些模块可以组合起来形成一个完整的学生信息管理系统。具体实现可以参考下面的代码:
阅读全文