用文件操作实现学生成绩管理系统中的存盘功能。在上一次学生成绩管理系统的基础上增加数据的存盘和加载功能,实现用户输入数据的保存及下次开启程序后的加载功能。要求分别按以下文件格式存放:1)、文本文件;2)、二进制文件。且要求输入的学生信息中至少有一条你自己的信息(包括学号和姓名)。
时间: 2024-03-09 19:50:41 浏览: 90
好的,这个问题需要涉及到文件的读写操作,我们可以使用 C 语言的文件操作函数来实现。
首先,我们需要定义一个结构体,用于存储学生信息,如下所示:
```c
struct student {
char id[20]; // 学号
char name[20]; // 姓名
int score; // 分数
};
```
然后,我们可以编写一个函数用于将学生信息保存到文件中:
```c
void saveData(char *filename, struct student *students, int count, int mode) {
FILE *fp;
if (mode == 1) {
// 以文本文件的方式保存
fp = fopen(filename, "w");
for (int i = 0; i < count; i++) {
fprintf(fp, "%s %s %d\n", students[i].id, students[i].name, students[i].score);
}
} else {
// 以二进制文件的方式保存
fp = fopen(filename, "wb");
fwrite(students, sizeof(struct student), count, fp);
}
fclose(fp);
}
```
上面的函数接受三个参数,分别是文件名、学生信息数组和学生数量。mode 参数用于指定保存文件的格式,1 表示文本文件,2 表示二进制文件。在函数内部,我们使用 fopen() 函数打开文件,并使用 fprintf() 函数将学生信息写入文件中,或使用 fwrite() 函数将学生信息以二进制格式写入文件中。最后,使用 fclose() 函数关闭文件。
接下来,我们可以编写一个函数用于从文件中加载学生信息:
```c
int loadData(char *filename, struct student *students, int maxCount, int mode) {
FILE *fp;
if (mode == 1) {
// 从文本文件中加载
fp = fopen(filename, "r");
int i = 0;
while (fscanf(fp, "%s %s %d", students[i].id, students[i].name, &students[i].score) != EOF && i < maxCount) {
i++;
}
fclose(fp);
return i;
} else {
// 从二进制文件中加载
fp = fopen(filename, "rb");
int count = fread(students, sizeof(struct student), maxCount, fp);
fclose(fp);
return count;
}
}
```
上面的函数接受四个参数,分别是文件名、学生信息数组、最大学生数量和文件格式。在函数内部,我们使用 fopen() 函数打开文件,并使用 fscanf() 函数从文本文件中读取学生信息,或使用 fread() 函数从二进制文件中读取学生信息。最后,使用 fclose() 函数关闭文件。
最后,我们可以在主函数中调用这些函数来实现学生成绩管理系统中的存盘功能。具体实现方式可以参考下面的示例代码:
```c
#include <stdio.h>
#include <string.h>
struct student {
char id[20]; // 学号
char name[20]; // 姓名
int score; // 分数
};
void saveData(char *filename, struct student *students, int count, int mode) {
FILE *fp;
if (mode == 1) {
// 以文本文件的方式保存
fp = fopen(filename, "w");
for (int i = 0; i < count; i++) {
fprintf(fp, "%s %s %d\n", students[i].id, students[i].name, students[i].score);
}
} else {
// 以二进制文件的方式保存
fp = fopen(filename, "wb");
fwrite(students, sizeof(struct student), count, fp);
}
fclose(fp);
}
int loadData(char *filename, struct student *students, int maxCount, int mode) {
FILE *fp;
if (mode == 1) {
// 从文本文件中加载
fp = fopen(filename, "r");
int i = 0;
while (fscanf(fp, "%s %s %d", students[i].id, students[i].name, &students[i].score) != EOF && i < maxCount) {
i++;
}
fclose(fp);
return i;
} else {
// 从二进制文件中加载
fp = fopen(filename, "rb");
int count = fread(students, sizeof(struct student), maxCount, fp);
fclose(fp);
return count;
}
}
int main() {
struct student students[100];
int count = 0;
// 先从文件中加载数据
count = loadData("data.txt", students, 100, 1);
// 如果文件中没有数据,则添加一些数据
if (count == 0) {
strcpy(students[0].id, "20210001");
strcpy(students[0].name, "张三");
students[0].score = 90;
strcpy(students[1].id, "20210002");
strcpy(students[1].name, "李四");
students[1].score = 85;
// 保存数据到文件中
saveData("data.txt", students, 2, 1);
count = 2;
}
// 输出学生信息到屏幕
printf("学号\t姓名\t分数\n");
for (int i = 0; i < count; i++) {
printf("%s\t%s\t%d\n", students[i].id, students[i].name, students[i].score);
}
return 0;
}
```
在程序运行时,首先会调用 loadData() 函数从文件中加载数据。如果文件中没有数据,则添加一些数据,并调用 saveData() 函数将数据保存到文件中。最后,程序会输出学生信息到屏幕上。
需要注意的是,我们可以通过修改结构体中的 id 和 name 字段来添加自己的信息。同时,我们还需要在程序中指定文件格式,1 表示文本文件,2 表示二进制文件。
阅读全文