编写一个程序实现以下3个功能:(1)从文本文件导入学生的数据;(2)显示给定序号学生信息;(3)输出学生成绩表。可利用第1题定义的结构体类型(struct Student),并直接利用或修改第1题已实现的函数使其能从文件输入。如输出print和line函数可以直接利用,输出成绩表可以在print_all函数的基础上修改。 具体要求如下: (1)先用记事本建立一个文件名为 “student.txt”文件,输入若干学生的信息,每行一个学生,各项数据用空格分隔,顺序与输入时的要求相同,保存在项目所在的文件夹下(如“图8-2”所示)。要求程序所能处理的学生数不能受程序的限制,“student.txt”文件中有多少学生的信息都可以处理。 (2)在main函数中做一个功能选择菜单,可选择题目要求实现的3个功能和退出程序(如“图8-3”所示)。输入不是0-3不予响应。 (3)显示学生信息:输入一个序号,按二进制随机读的方式从“student.dat”文件中读取一个学生的信息,并在屏幕上输出;输入序号超出实际人数时给出错误提示,输入0时返回到功能菜单选择(如“图8-4”所示)。 (4)输出学生成绩表:按二进制方式从“student.dat”文件中顺序读取每一个学生的信息,并在屏幕上输出(如“图8-5”所示)。“student.dat”不存在时给出错误提示。
时间: 2023-02-21 17:40:03 浏览: 490
下面是一个示例程序,可以实现上述功能:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_GENDER_LEN 10
#define MAX_ID_LEN 20
struct Student {
char name[MAX_NAME_LEN];
char gender[MAX_GENDER_LEN];
char id[MAX_ID_LEN];
int age;
int score;
};
int import_from_file(const char *filename, struct Student **students, int *num_students) {
// 从文件导入学生数据
// 将文件中的每行数据转换成结构体存储
// 并将结构体指针和学生数量存储在传入的指针变量中
// 返回0表示成功,返回其他值表示失败
FILE *fp = fopen(filename, "r");
if (!fp) {
return -1;
}
int count = 0;
char line[1024];
while (fgets(line, sizeof(line), fp)) {
// 读取文件中的每一行,并将数据转换成结构体
struct Student *student = (struct Student *)malloc(sizeof(struct Student));
if (sscanf(line, "%s %s %s %d %d", student->name, student->gender, student->id, &student->age, &student->score) == 5) {
// 将结构体添加到数组中
students[count] = student;
count++;
} else {
// 读取失败,释放内存
free(student);
}
}
fclose(fp);
*num_students = count;
return 0;
}
void print_student(const struct Student *student) {
// 打印学生信息
printf("姓名: %s\n", student->name);
printf("性别: %s\n", student->gender);
printf("学号: %s\n", student->id);
printf("年龄: %d\n", student->age);
printf("成绩: %d\n", student->score);
}
void print_all(const struct Student **students, int num
阅读全文