本关的编程任务是补全step2/fileTxt.c文件中ReadStudInfo函数和SaveResult函数,以实现按格式使用FILE结构存取学生信息的功能。 #include <stdio.h> #include <stdlib.h> #define COURSE_MAXNUM 5 //声明结构STUDENT struct student { long studentID; char studentName[20]; char sex[4]; struct{ int year; int month; int day; }birthday; float score[COURSE_MAXNUM]; float total; float average; int rank; }; typedef struct student STUDENT; //从文件fileName表示的二进制文件中读取学生基本信息, //包括学号、姓名、性别、出生日期,若干门课程的成绩 //文件的第一行存储的信息包含了n和m,即学生的人数和课程门数 void ReadStudInfo(const char *fileName, STUDENT stud[]) { /*************Begin***************/ /*************End*****************/ } //向文件fileName表示的二进制文件中写入学生基本信息, //包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次 //文件的第一行存储的信息应该包括n和m,即学生的人数和课程门数 void SaveResult(const char *fileName, STUDENT stud[],int n,int m) { /*************Begin***************/ /*************End*****************/ }
时间: 2025-06-01 21:09:45 浏览: 21
### C语言实现ReadStudInfo和SaveResult函数
以下代码展示了如何使用C语言实现`ReadStudInfo`和`SaveResult`函数,分别用于从二进制文件中读取学生信息以及向二进制文件写入学生信息。代码中涉及的`student`结构体包含学号、姓名、性别、出生日期和成绩等字段。
#### 结构体定义
```c
#include <stdio.h>
#include <string.h>
#define MAX_NAME_LEN 50
struct Student {
int id; // 学号
char name[MAX_NAME_LEN]; // 姓名
char gender; // 性别 ('M' 或 'F')
char birthdate[11]; // 出生日期 (格式: YYYY-MM-DD)
float score; // 成绩
};
```
#### ReadStudInfo函数实现
`ReadStudInfo`函数从指定的二进制文件中读取学生信息,并将其存储到`Student`结构体数组中。
```c
int ReadStudInfo(const char *filename, struct Student students[], int max_count) {
FILE *fp = fopen(filename, "rb"); // 以二进制读方式打开文件[^2]
if (fp == NULL) {
return -1; // 文件打开失败
}
int count = 0;
while (count < max_count && fread(&students[count], sizeof(struct Student), 1, fp) == 1) {
count++;
}
fclose(fp); // 关闭文件
return count; // 返回成功读取的学生数量
}
```
#### SaveResult函数实现
`SaveResult`函数将学生信息保存到指定的二进制文件中。
```c
int SaveResult(const char *filename, const struct Student students[], int count) {
FILE *fp = fopen(filename, "wb"); // 以二进制写方式打开文件
if (fp == NULL) {
return -1; // 文件打开失败
}
for (int i = 0; i < count; i++) {
if (fwrite(&students[i], sizeof(struct Student), 1, fp) != 1) {
fclose(fp);
return -2; // 写入失败
}
}
fclose(fp); // 关闭文件
return 0; // 成功
}
```
#### 示例用法
以下是一个完整的示例程序,展示如何调用`ReadStudInfo`和`SaveResult`函数。
```c
int main() {
struct Student students[100];
int count;
// 写入学生信息到二进制文件
struct Student new_students[] = {
{1, "Alice", 'F', "2000-01-01", 95.5},
{2, "Bob", 'M', "2000-02-02", 88.0},
{3, "Charlie", 'M', "2000-03-03", 78.5}
};
if (SaveResult("student.dat", new_students, 3) == 0) {
printf("数据写入成功!\n");
} else {
printf("数据写入失败!\n");
}
// 从二进制文件读取学生信息
count = ReadStudInfo("student.dat", students, 100);
if (count == -1) {
printf("读取文件失败!\n");
} else {
printf("成功读取 %d 条学生记录:\n", count);
for (int i = 0; i < count; i++) {
printf("ID: %d, Name: %s, Gender: %c, Birthdate: %s, Score: %.2f\n",
students[i].id, students[i].name, students[i].gender,
students[i].birthdate, students[i].score);
}
}
return 0;
}
```
### 注意事项
- 在读写二进制文件时,必须确保文件以正确的模式(如`"rb"`或`"wb"`)打开。
- `fread`和`fwrite`函数操作的是字节流,因此需要明确结构体的大小和对齐方式。
- 如果文件中包含的数据量超过预定义的数组大小,应动态分配内存以避免溢出。
阅读全文
相关推荐

















