C写一个函数:void init(Student slist[],int *scount,Course clist[],int *ccount, Select sclist[],int *sccount];程序启动运行时通过指定的文件装入(如果没有指定或指定失败,则从默认的文件装入)相关必要信息,包括学生信息、课程信息已经学生选课信息,并将学生记录条数、课程记录条数以及选课记录条数分别保存到指针变量*scount、*ccount和*sccount中。(slist.txt是学生信息表,clist.txt是课程信息表,sclist.txt是选课信息表)
时间: 2023-06-11 11:09:55 浏览: 193
以下是一个可能的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 50
#define MAX_ID_LEN 20
#define MAX_COURSE_LEN 50
#define MAX_FILE_NAME_LEN 100
#define MAX_LINE_LEN 200
// 定义学生结构体
typedef struct {
char id[MAX_ID_LEN];
char name[MAX_NAME_LEN];
} Student;
// 定义课程结构体
typedef struct {
char code[MAX_ID_LEN];
char name[MAX_COURSE_LEN];
} Course;
// 定义选课结构体
typedef struct {
char sid[MAX_ID_LEN];
char ccode[MAX_ID_LEN];
} Select;
// 从文件中读取学生信息,保存到slist数组中,返回学生数量
int read_students(char *filename, Student slist[]) {
int count = 0;
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file %s\n", filename);
return 0;
}
char line[MAX_LINE_LEN];
while (fgets(line, MAX_LINE_LEN, fp) != NULL) {
line[strcspn(line, "\r\n")] = 0; // 去掉换行符
char *id = strtok(line, ",");
char *name = strtok(NULL, ",");
strcpy(slist[count].id, id);
strcpy(slist[count].name, name);
count++;
}
fclose(fp);
return count;
}
// 从文件中读取课程信息,保存到clist数组中,返回课程数量
int read_courses(char *filename, Course clist[]) {
int count = 0;
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file %s\n", filename);
return 0;
}
char line[MAX_LINE_LEN];
while (fgets(line, MAX_LINE_LEN, fp) != NULL) {
line[strcspn(line, "\r\n")] = 0; // 去掉换行符
char *code = strtok(line, ",");
char *name = strtok(NULL, ",");
strcpy(clist[count].code, code);
strcpy(clist[count].name, name);
count++;
}
fclose(fp);
return count;
}
// 从文件中读取选课信息,保存到sclist数组中,返回选课数量
int read_selections(char *filename, Select sclist[]) {
int count = 0;
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file %s\n", filename);
return 0;
}
char line[MAX_LINE_LEN];
while (fgets(line, MAX_LINE_LEN, fp) != NULL) {
line[strcspn(line, "\r\n")] = 0; // 去掉换行符
char *sid = strtok(line, ",");
char *ccode = strtok(NULL, ",");
strcpy(sclist[count].sid, sid);
strcpy(sclist[count].ccode, ccode);
count++;
}
fclose(fp);
return count;
}
// 初始化函数,从文件中读取学生信息、课程信息和选课信息
void init(Student slist[], int *scount, Course clist[], int *ccount, Select sclist[], int *sccount) {
char sfile[MAX_FILE_NAME_LEN] = "slist.txt";
char cfile[MAX_FILE_NAME_LEN] = "clist.txt";
char scfile[MAX_FILE_NAME_LEN] = "sclist.txt";
// 如果指定了文件名,使用指定的文件名
if (getenv("SFILE") != NULL) {
strcpy(sfile, getenv("SFILE"));
}
if (getenv("CFILE") != NULL) {
strcpy(cfile, getenv("CFILE"));
}
if (getenv("SCFILE") != NULL) {
strcpy(scfile, getenv("SCFILE"));
}
*scount = read_students(sfile, slist);
*ccount = read_courses(cfile, clist);
*sccount = read_selections(scfile, sclist);
}
int main() {
// 声明学生、课程和选课数组
Student slist[100];
int scount = 0;
Course clist[100];
int ccount = 0;
Select sclist[100];
int sccount = 0;
// 初始化,从文件中读取数据
init(slist, &scount, clist, &ccount, sclist, &sccount);
// 输出读取结果
printf("Read %d students:\n", scount);
for (int i = 0; i < scount; i++) {
printf("%s %s\n", slist[i].id, slist[i].name);
}
printf("Read %d courses:\n", ccount);
for (int i = 0; i < ccount; i++) {
printf("%s %s\n", clist[i].code, clist[i].name);
}
printf("Read %d selections:\n", sccount);
for (int i = 0; i < sccount; i++) {
printf("%s %s\n", sclist[i].sid, sclist[i].ccode);
}
return 0;
}
```
这个程序实现了一个 `init` 函数,用于从文件中读取学生、课程和选课信息,保存到对应的数组中,并返回数组长度。具体实现中,使用了 `read_students`、`read_courses` 和 `read_selections` 函数,分别从文件中读取对应信息,保存到对应的数组中。在 `main` 函数中,声明了学生、课程和选课数组,并调用 `init` 函数初始化它们。最后,输出读取结果。
注意,程序中使用了一些预定义的常量和结构体,如 `MAX_NAME_LEN`、`MAX_ID_LEN`、`MAX_COURSE_LEN`、`MAX_FILE_NAME_LEN`、`MAX_LINE_LEN`、`Student`、`Course` 和 `Select`。这些需要根据实际情况进行调整。此外,程序中假设输入文件格式正确,没有进行错误处理。
阅读全文