本关的编程任务是补全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 17:09:51 浏览: 17
### 补全ReadStudInfo和SaveResult函数以实现学生信息的读写功能
以下代码展示了如何使用C语言实现`ReadStudInfo`和`SaveResult`函数,分别用于从文本文件中读取学生信息以及向文本文件写入学生信息。学生信息包括学号、姓名、性别、出生日期、成绩、总分、平均分和名次。
#### 定义结构体
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define COURSE_MAXNUM 5
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;
```
#### ReadStudInfo函数实现
`ReadStudInfo`函数从文本文件中读取学生基本信息,并将其存储到`STUDENT`结构体数组中[^1]。
```c
void ReadStudInfo(const char *fileName, STUDENT stud[]) {
FILE *fp = fopen(fileName, "r"); // 以文本读方式打开文件
if (fp == NULL) {
perror("无法打开文件");
return;
}
int n, m; // 学生人数和课程门数
fscanf(fp, "%d %d", &n, &m); // 读取第一行的学生人数和课程门数
for (int i = 0; i < n; i++) {
fscanf(fp, "%ld %s %s %d %d %d",
&stud[i].studentID, stud[i].studentName, stud[i].sex,
&stud[i].birthday.year, &stud[i].birthday.month, &stud[i].birthday.day);
for (int j = 0; j < m; j++) {
fscanf(fp, "%f", &stud[i].score[j]);
}
}
fclose(fp);
}
```
#### SaveResult函数实现
`SaveResult`函数将学生信息保存到文本文件中,文件的第一行包含学生人数和课程门数[^2]。
```c
void SaveResult(const char *fileName, STUDENT stud[], int n, int m) {
FILE *fp = fopen(fileName, "w"); // 以文本写方式打开文件
if (fp == NULL) {
perror("无法打开文件");
return;
}
fprintf(fp, "%d %d\n", n, m); // 写入学生人数和课程门数
for (int i = 0; i < n; i++) {
fprintf(fp, "%ld %s %s %d %d %d ",
stud[i].studentID, stud[i].studentName, stud[i].sex,
stud[i].birthday.year, stud[i].birthday.month, stud[i].birthday.day);
for (int j = 0; j < m; j++) {
fprintf(fp, "%.2f ", stud[i].score[j]);
}
fprintf(fp, "%.2f %.2f %d\n", stud[i].total, stud[i].average, stud[i].rank);
}
fclose(fp);
}
```
#### 示例用法
以下是一个完整的示例程序,展示如何调用`ReadStudInfo`和`SaveResult`函数。
```c
int main() {
STUDENT students[100];
int n = 3, m = 5;
// 示例学生数据
STUDENT example_students[3] = {
{1001, "Alice", "F", {2000, 1, 1}, {85.0, 90.0, 88.0, 92.0, 87.0}, 442.0, 88.4, 1},
{1002, "Bob", "M", {2000, 2, 2}, {78.0, 82.0, 80.0, 85.0, 81.0}, 406.0, 81.2, 2},
{1003, "Charlie", "M", {2000, 3, 3}, {90.0, 92.0, 91.0, 89.0, 88.0}, 450.0, 90.0, 3}
};
// 保存学生信息到文件
SaveResult("students.txt", example_students, n, m);
// 从文件读取学生信息
ReadStudInfo("students.txt", students);
// 输出读取的学生信息
printf("学生信息如下:\n");
for (int i = 0; i < n; i++) {
printf("学号: %ld, 姓名: %s, 性别: %s, 出生日期: %d-%d-%d\n",
students[i].studentID, students[i].studentName, students[i].sex,
students[i].birthday.year, students[i].birthday.month, students[i].birthday.day);
printf("成绩: ");
for (int j = 0; j < m; j++) {
printf("%.2f ", students[i].score[j]);
}
printf("\n总分: %.2f, 平均分: %.2f, 名次: %d\n", students[i].total, students[i].average, students[i].rank);
}
return 0;
}
```
### 注意事项
- 在读写文本文件时,确保文件以正确的模式(如`"r"`或`"w"`)打开。
- `fscanf`和`fprintf`函数操作的是格式化文本流,因此需要明确每行的格式。
- 如果文件中包含的数据量超过预定义的数组大小,应动态分配内存以避免溢出。
阅读全文
相关推荐
















