解读void student_information_load(struct information *stu) { //读入序号 fscanf(fp,"%d",&stu->number); //读入学号 fscanf(fp,"%s",stu->id); //读入姓名 fscanf(fp,"%s",stu->name); //读入性别 fscanf(fp,"%s",stu->gender); //读入班级 fscanf(fp,"%s",stu->clas); } void student_information_print(struct information *stu) { fputs(stu->name,fpp); fprintf(fpp,"\t"); fputs(stu->gender,fpp); fprintf(fpp,"\t"); fputs(stu->clas,fpp); fprintf(fpp,"\n"); }
时间: 2023-12-06 20:40:49 浏览: 172
这是两个函数,分别是读入学生信息和打印学生信息的函数。这里用到了结构体指针,结构体包含了学生的序号、学号、姓名、性别和班级等信息。
函数 `student_information_load()` 用于从文件中读取学生信息,输入参数为一个指向结构体的指针 `stu`。首先通过 `fscanf()` 函数读取学生的序号、学号、姓名、性别和班级等信息,然后将这些信息存储在结构体 `stu` 中。
函数 `student_information_print()` 用于将学生信息打印到文件中,输入参数也是一个指向结构体的指针 `stu`。函数中使用了 `fputs()` 和 `fprintf()` 函数将学生的姓名、性别和班级等信息写入到文件中。
这两个函数一般是作为学生信息管理系统的一部分,用于读取和打印学生信息。
相关问题
优化这段代码void student_information(struct stu **point) { //显示全部考生信息 FILE *fp; int i; struct stu *new; static struct stu *tail; if ((fp = fopen("C:/Users/MonnyX/Desktop/c/file2.dat", "r")) == NULL) { printf("打开文件失败!\n"); exit(0); } for (i = 1;i<=2; i++) { new = (struct stu *)malloc(sizeof(struct stu)); if (new == NULL) { printf("内存分配失败!\n"); exit(1); } fscanf(fp, "%d", &new->num); fscanf(fp, "%s", new->name); fscanf(fp, "%d", &new->age); fscanf(fp, "%s", new->sex); if (*point == NULL) { *point = new; new->next = NULL; } else { tail->next = new; new->next = NULL; } } tail = new; for(i=1;i<=2;i++){ printf("%d", new->num); printf("%s", new->name); printf("%d", new->age); printf("%s", new->sex); new=new->next; } fclose(fp); system("pause"); system("clear"); }
这段代码可以进行如下优化:
1. 将文件路径定义为常量或者宏,以便于修改和维护。
2. 将读取文件的代码封装成一个函数,可以复用。
3. 使用fgets()函数代替fscanf()函数,可以避免因为格式化字符串不匹配而导致的错误。
4. 将打印信息的代码封装成一个函数,可以复用。
5. 去掉不必要的变量和操作,简化代码结构。
6. 最好不要使用system()函数,因为它不可移植,可以使用跨平台的清屏函数。
下面是优化后的代码:
```
#define FILE_PATH "C:/Users/MonnyX/Desktop/c/file2.dat"
void read_student_information(struct stu **point) {
FILE *fp;
int i;
struct stu *new;
static struct stu *tail;
if ((fp = fopen(FILE_PATH, "r")) == NULL) {
printf("打开文件失败!\n");
exit(0);
}
for (i = 1; i <= 2; i++) {
new = (struct stu *)malloc(sizeof(struct stu));
if (new == NULL) {
printf("内存分配失败!\n");
exit(1);
}
char buf[1024];
fgets(buf, sizeof(buf), fp);
sscanf(buf, "%d %s %d %s", &new->num, new->name, &new->age, new->sex);
if (*point == NULL) {
*point = new;
new->next = NULL;
} else {
tail->next = new;
new->next = NULL;
}
tail = new;
}
fclose(fp);
}
void print_student_information(struct stu *point) {
while (point != NULL) {
printf("%d %s %d %s\n", point->num, point->name, point->age, point->sex);
point = point->next;
}
}
void student_information(struct stu **point) {
read_student_information(point);
print_student_information(*point);
clear_screen();
}
```
struct Stu* create(CONF conf, int mode) { struct Stu* head, * node, * end; //定义头节点,普通节点,尾节点 head = (struct Stu*)malloc(sizeof(struct Stu)); //给头节点申请内存 //若是空表,则头尾地址一致 FILE* fp3; if (mode == 1) { strcpy(conf.filesavepath, "C:\\Users\\C语言\\lab3-22281252new\\DataFile.txt"); } if ((fp3 = fopen(conf.filesavepath, "r")) == NULL) { printf("配置文件没有被打开\n"); exit(EXIT_FAILURE);//这条语句是退出程序的意思 } fscanf(fp3, "%d", &conf.number); head->elem1 = conf.number; end = head; for (int i = 0; i < conf.number; i++) { //利用for循环向链表中添加数据 node = (struct Stu*)malloc(sizeof(struct Stu));//给普通节点申请内存空间 fscanf(fp3, "%d%d%d", &(node->elem1), &(node->elem2), &(node->elem3)); //给数据域赋值 end->next = node; //让上一个节点的数据域指向当前节点 end = node; //end指向当前节点,最终end指向尾节点 } end->next = NULL; print(head); //在屏幕上显示数据 return head; //返回头节点的地址 }的作用
这段代码的作用是从文件中读取学生信息,并将学生信息存储在一个链表中。它首先定义了一个头节点head、一个普通节点node和一个尾节点end。然后它从配置文件中读取一个整数,存储在conf.number中,并将其设置为头节点的elem1成员。接下来,它利用for循环向链表中添加conf.number个普通节点,每个普通节点有三个整型成员elem1、elem2和elem3,这三个成员的值分别从文件中读取。在每次循环中,它将每个新节点添加到链表的尾部,并将end指向新节点。最后,它将链表头节点的地址返回,并在屏幕上显示链表中的数据。
阅读全文