编写一个程序实现以下3个功能:(1)从文本文件导入学生的数据;(2)显示给定序号学生信息;(3)输出学生成绩表。可利用第1题定义的结构体类型(struct Student),并直接利用或修改第1题已实现的函数使其能从文件输入。如输出print和line函数可以直接利用,输出成绩表可以在print_all函数的基础上修改。 具体要求如下: (1) 先用记事本建立一个文件名为 “student.txt”文件,输入若干学生的信息,每行一个学生,各项数据用空格分隔,顺序与输入时的要求相同,保存在项目所在的文件夹下(如“图8-2”所示)。要求程序所能处理的学生数不能受程序的限制,“student.txt”文件中有多少学生的信息都可以处理。 图8-2 图8-3 (2) 在main函数中做一个功能选择菜单,可选择题目要求实现的3个功能和退出程序(如“图8-3”所示)。输入不是0-3不予响应。 (3) 导入学生信息:从“student.txt”中读取学生信息,并按二进制方式写到文件“student.dat”中。“student.txt”不存在和导入数据完成后在屏幕上输出相应的提示信息。 (4) 显示学生信息:输入一个序号,按二进制随机读的方式从“student.dat”文件中读取一个学生的信息,并在屏幕上输出;输入序号超出实际人数时给出错误提示,输入0时返回到功能菜单选择(如“图8-4”所示)。 图8-4 (5) 输出学生成绩表:按二进制方式从“student.dat”文件中顺序读取每一个学生的信息,并在屏幕上输出(如“图8-5”所示)。“student.dat”不存在时给出错误提示。
时间: 2024-02-05 14:13:57 浏览: 208
这是一个完整的程序,实现了题目要求的三个功能,以及相应的提示信息和错误处理。需要注意的是,程序中的路径和文件名都是根据实际情况进行修改的,需要根据自己的实际情况进行修改。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
// 定义学生结构体
struct Student {
char name[MAX_NAME_LEN];
int id;
int age;
float score;
};
// 打印分割线
void print_line() {
printf("----------------------------------------\n");
}
// 打印单个学生的信息
void print(struct Student *stu) {
printf("姓名:%s\n", stu->name);
printf("学号:%d\n", stu->id);
printf("年龄:%d\n", stu->age);
printf("成绩:%f\n", stu->score);
}
// 从文件中读取学生信息,并写入二进制文件
void input() {
FILE *fp_txt, *fp_dat;
struct Student stu;
int count = 0;
fp_txt = fopen("student.txt", "r");
if (fp_txt == NULL) {
printf("无法打开文件 student.txt\n");
return;
}
fp_dat = fopen("student.dat", "wb");
if (fp_dat == NULL) {
printf("无法打开文件 student.dat\n");
fclose(fp_txt);
return;
}
while (fscanf(fp_txt, "%s %d %d %f", stu.name, &stu.id, &stu.age, &stu.score) != EOF) {
fwrite(&stu, sizeof(struct Student), 1, fp_dat);
count++;
}
fclose(fp_txt);
fclose(fp_dat);
printf("成功导入 %d 条学生信息\n", count);
}
// 从二进制文件中读取指定序号学生的信息
void show() {
FILE *fp;
struct Student stu;
int num, count = 0;
fp = fopen("student.dat", "rb");
if (fp == NULL) {
printf("无法打开文件 student.dat\n");
return;
}
printf("请输入要查看的学生序号(1~N):");
scanf("%d", &num);
while (fread(&stu, sizeof(struct Student), 1, fp) == 1) {
count++;
if (count == num) {
print_line();
printf("学生信息如下:\n");
print(&stu);
print_line();
fclose(fp);
return;
}
}
printf("错误:没有找到该学生\n");
fclose(fp);
}
// 输出所有学生的信息
void print_all() {
FILE *fp;
struct Student stu;
fp = fopen("student.dat", "rb");
if (fp == NULL) {
printf("无法打开文件 student.dat\n");
return;
}
printf("学生信息如下:\n");
print_line();
while (fread(&stu, sizeof(struct Student), 1, fp) == 1) {
print(&stu);
print_line();
}
fclose(fp);
}
// 主函数,实现功能选择菜单
int main() {
int choice;
while (1) {
printf("请选择要进行的操作:\n");
printf("1. 导入学生信息\n");
printf("2. 显示学生信息\n");
printf("3. 输出学生成绩表\n");
printf("0. 退出程序\n");
printf("请输入数字选择功能:");
scanf("%d", &choice);
switch (choice) {
case 1:
input();
break;
case 2:
show();
break;
case 3:
print_all();
break;
case 0:
printf("程序已退出\n");
exit(0);
default:
printf("错误:请输入数字 0~3\n");
break;
}
printf("\n");
}
return 0;
}
```
阅读全文