关于一个简单的成绩管理系统。信息总显示乱码
开始是先创建一个文件,然后输入数据,输入完数据后保存数据在磁盘中,可是却出现了乱码。 当打开这个文件时,显示信息,显示的也是乱码。主要是看这两个函数 //声明保存学生信息的函数 void save(struct student *current, FILE *file); //声明添加学生信息函数 struct student *add(struct student *head);
程序代码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN sizeof(struct student) //学生信息结构的长度 #define MAXNAMES 10 //存储名字的字节 #define MAXSEX 2 //汉语的性别需要2个字节 #define MAXSTUS 50 //最多存储的学生信息 #define MAXFILENAME 50 struct score //成绩的结构体 { float C; float math; float chinese; }; //学生信息的结构体 struct student { int IDnum; char name[MAXNAMES]; int class; struct score student_score; struct student * next; //指向链表的下一个结构 }; //判断学号是否存在 0是不存在,1是存在 int judge(struct student * head, int IDnum); //声明添加学生信息函数 struct student *add(struct student *head); //声明删除学生信息函数 struct student *del(struct student *head); //声明显示学生信息列表函数 void show_info(FILE * file); //声明排序函数 void sort(struct student *head); //声明修改函数 void modify(struct student *head); //声明查找函数 void find(struct student *head); //声明保存学生信息的函数 void save(struct student *current, FILE *file); int count = 1; //计算学生的数量 //主函数 int main(void) { struct student * head = NULL; //链表的头指针,先声明指向NULL //进入界面 while (1) { int flag = 0; printf("------------------------------------------\n"); printf(" 开始界面 \n"); printf("------------------------------------------\n"); printf("一:创建文件\n"); printf("二:打开文件\n"); printf("------------------------------------------\n"); printf("输入数字1或2选择:"); fflush(stdin); scanf("%d", &flag); //创建文件 if (1 == flag) { char new_file_name[MAXFILENAME]; //新文件的名字 int flag_creat = 0; //是否退出创建文件选项的标志 FILE * new_file_pointer; //指向新文件的指针 printf("请输入创建的文件名(请勿与磁盘中的文件重名):"); fflush(stdin); //清空键盘缓冲区 scanf("%s", new_file_name); while (NULL == (new_file_pointer = fopen(new_file_name,"wb+"))) { printf("error:创建失败\n"); printf("请重新输入新的文件名:"); fflush(stdin); scanf("%s", new_file_name); } while (0 == flag_creat) { int select = 0; printf("--------------------------------\n"); printf("①添加学生信息\n"); printf("②保存信息\n"); printf("③退出\n"); printf("--------------------------------\n"); printf("请选择操作项:"); fflush(stdin); scanf("%d", &select); //添加学生信息 if (1 == select) { head = add(head); printf("数据添加成功\n"); system("pause"); } //保存信息 else if (2 == select) { rewind(new_file_pointer); save(head, new_file_pointer); //往新建文件中保存数据,直接传递头指针 printf("保存成功\n"); system("pause"); } //退出 else if (3 == select) { flag_creat = 1; } else { printf("请输入数字1,2或3.\n"); system("pause"); } system("cls"); } } //打开已有文件 else if (2 == flag) { char file_name[MAXFILENAME]; int flag_open = 0; //是否退出选项的标志 FILE * file_pointer; //指向文件的指针 printf("请输入要打开文件的文件名:"); scanf("%s", file_name); while (NULL == (file_pointer = fopen(file_name, "ab+"))) { printf("error:打开失败\n"); printf("请重新输入文件名:"); fflush(stdin); scanf("%s", file_name); } while (0 == flag_open) { int select = 0; //打开已有文件后的界面 printf("输入数字1,2,3,4......进行选择\n"); printf("------------------------------------------\n"); printf("①添加学生数据\n"); printf("②显示成绩列表\n"); printf("③删除学生\n"); printf("④排序\n"); printf("⑤保存数据\n"); printf("⑥读取数据\n"); printf("⑦修改\n"); printf("⑧退出系统\n"); printf("------------------------------------------\n"); printf("请选择操作项:"); fflush(stdin); scanf("%d", &select); //添加学生信息 if (1 == select) { head = add(head); printf("数据添加成功\n"); system("pause"); } //显示信息列表 else if (2 == select) { show_info(file_pointer); printf("已全部显示\n"); system("pause"); } else if (3 == select) { } else if (4 == select) { } else if (5 == select) { rewind(file_pointer); save(head, file_pointer); //往新建文件中保存数据,直接传递头指针 printf("保存成功\n"); system("pause"); } else if (6 == select) { } else if (7 == select) { } //退出 else if (8 == select) { flag_open = 1; } else { printf("请输入数字1,2,3,4......进行选择\n"); system("pause"); } system("cls"); } } else { printf("请输入1或2\n"); system("pause"); } system("cls"); } system("pause"); return 0; } //添加学生信息,建立链表 struct student *add(struct student *head) { int temp_IDnum = 0; struct student * prev, *current; current = (struct student *)malloc(LEN); current->next = NULL; current->IDnum = 0; //对新的节点的IDnum初始化为0 if (NULL == head) { head = current; //往新文件中添加学生信息 } else { prev = head; //往已有文件中添加学生信息 while (prev->next != NULL) { prev = prev->next; //找到链表的结尾 count++; } count++; prev->next = current; //将新的节点加到链表中 } //添加学生信息 printf("\n当学号为0时则停止添加,回到主界面\n"); printf("---------请输入学生信息---------\n"); printf("请输入第%d个学生的学号:", count); //fflush(stdin); //清空键盘缓冲区 scanf("%d", &temp_IDnum); while (0 != temp_IDnum) { while (1) { int judge_flag = 0; judge_flag = judge(head, temp_IDnum); //判断学号是否重复 if (0 == judge_flag) //0是不存在,1是存在 { break; } else //存在 { printf("该学号已录入信息,请重新输入学号:"); //fflush(stdin); //清空键盘缓冲区 scanf("%d", &temp_IDnum); } } current -> IDnum = temp_IDnum; printf("请输入第%d个学生的姓名:", count); //fflush(stdin); scanf("%s", &(current->name)); printf("请输入第%d个学生的班级:", count); //fflush(stdin); //清空键盘缓冲区 scanf("%d", &(current -> class)); printf("C语言的分数:"); //fflush(stdin); scanf("%f", &(current->student_score.C) ); printf("数学的分数:"); //fflush(stdin); scanf("%f", &(current->student_score.math)); printf("语文的分数:"); //fflush(stdin); scanf("%f", &(current->student_score.chinese)); count++; //统计学生数量 prev = current; current = (struct student *)malloc(LEN); //创建新的节点 current->next = NULL; current->IDnum = 0; //对新的节点的IDnum初始化为0 prev->next = current; printf("\n"); printf("请输入第%d个学生的学号:", count); //fflush(stdin); scanf("%d", &temp_IDnum); } return head; } //判断学号是否存在 0是不存在,1是存在 int judge(struct student * head, int temp_IDnum) { int judge_flag = 0; struct student * current; current = head; do { if (current->IDnum == temp_IDnum) { judge_flag = 1; break; } current = current->next; } while (current != NULL); return judge_flag; } //定义保存信息的函数 void save(struct student *current, FILE * file) //如果是选择新建的文件,则current接收新链表的头指针 { //如果是原来存在的文件,则current接受最先加入节点的指针 while (NULL != current) { fwrite(current, LEN, 1, file); current = current->next; } fclose(file); } //定义显示信息列表的函数 void show_info(FILE * file) { rewind(file); struct student * show_head, * current; show_head = (struct student *)malloc(LEN); current = show_head; while (!feof(file)) { fread(current, LEN, 1, file); current->next = (struct student *)malloc(LEN); } while (NULL != show_head) { printf("%-5d%-10s%-10d%-6f%-6f%-5f\n", show_head->IDnum, show_head->name, show_head->class, show_head->student_score.C, show_head->student_score.math, show_head->student_score.chinese); show_head = show_head->next; } }