11. 保存班级信息功能的实现

保存班级信息功能是将 class_rooms 结构体数据存储于某个文件中。文件格式指定为 CSV 文件格式。

其默认的存档文件定义如下:

// 默认的文档存储路径
#define DEFAULT_DOC_PATHNAME   "./students.csv"

存档后的 csv文件格式如下:

班级名称
学生姓名
语文成绩
数学成绩
一年1班
张三
100
99
一年1班
李四
98
97
一年2班
王五
96
95
一年2班
赵六
94
93

从上述表格可以看出,班级名称相同,则属于一个班内的学生。

具体实现方法分为两部分,第一部分 school 模块中的 save_to_csv_file 负责打开文件,然后遍历每一个班级。第二部分再由各个班级模块 class_room 中的 writer_to_csv_writer 负责自己班级的学生信息写入文件中。

具体代码如下

文件 school.c

// 保存班级信息,成功返回 1,失败返回 0;
int save_to_csv_file(const char *path_name)
{
    const char * header = "班级名称,学生姓名,语文成绩,数学成绩";
    FILE * file = fopen(path_name, "w");  // 打开文件
    int i;

    if (NULL == file) {
        printf("打开文件失败,保存文件失败!\n");
        return 0;
    }
    fprintf(file, "%s\r\n", header);

    for (i = 0; i < class_room_count; i++) {
        writer_to_csv_writer(&class_rooms[i], file);
    }

    fclose(file);
    return 1;
}

文件 class_room.c

// 写入一个班级的学生数据
void writer_to_csv_writer(class_room_t *aclass, FILE *csv_file)
{
    int i;
    for (i = 0; i < aclass->student_count; i++) {
        student_t *astu = &aclass->student[i];
        fprintf(csv_file, "%s,%s,%d,%d\r\n", aclass->class_title,
            astu->name, astu->chinese_score, astu->math_score);
    }
}