信息管理系统
最近看到了很多关于信息管理系统的贴,我自己也做了一个~算是对现阶段编程能力的一种自我检测吧~看看效果如何,发个来看看(噢,感觉做得有点特别~新手可能看不懂哦)~vc编译环境运行~~如果其它编译器有问题不能通过,那就这样先吧~
[此贴子已经被作者于2017-1-6 02:02编辑过]
/*动态更新,写在前面的话:注意文件保存格式用txt--学号设置不能重复输入 第一阶段完结~代码突破了1000行*/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include<windows.h> #define SIZE_FUN 7//这个是菜单长度,最大为10,大于10会出错 #define LEN sizeof(Student)//这个是Student的大小 #define MEMBER(A) (int)A-(int)head//这个是用来获取结构体成员的地址的 typedef int FUN (int,void *p,void *p2[]);//定义新函数类型 typedef struct Student//初始化 { char num[3]; char name[10]; int score; struct Student *date; struct Student *back; }Student; Student *head=NULL; typedef struct PRINT_SET//定义字库结构体 { char ss1[5];//这个是字库关键字 char ss2[100];//这个似乎关键字对应的内容 }PRINT_SET;//这个是输出字库 int camp(const void *p1,const void *p2)//快排用的序函数 { return strcmp(((PRINT_SET *)p1)->ss1,((PRINT_SET *)p2)->ss1); } void print_set(const void *str)//字库管理函数 { static flag=1; static PRINT_SET p[]= { "1001","\n您需要查询的学生信息为:\n", "1002","\n没有找到需要查询学生的信息", "1010","\n请输入您需要查询学生的学号", "1011","\n请输入您需要查询学生的姓名", "1021","\n请输入您需要插入学生的学号", "1022","\n请输入您需要删除学生的学号", "1023","\n请输入您需要修改学生的学号", "1030","请输入读取文件路径:", "1031","请输入读取文件路径:", "2001","\n该学号已经存在,请重新输入\n", "3001","\n请输入:Y--进行创建,追加学生信息;N--返回菜单(请输入Y\\N)", "3011","\n请输入:Y--进行保存学生信息;N--返回菜单(请输入Y\\N)", "3012","\n请输入:Y--进行读取学生信息;N--返回菜单(请输入Y\\N)", "3031","\n请输入:Y--进行按学号查找学生信息;N--返回菜单(请输入Y\\N)", "3032","\n请输入:Y--进行按姓名查找学生信息;N--返回菜单(请输入Y\\N)", "3033","\n请输入:Y--进行按学号插入学生信息;N--返回菜单(请输入Y\\N)", "3034","\n请输入:Y--进行按学号删除学生信息;N--返回菜单(请输入Y\\N)", "3035","\n请输入:Y--进行清空学生信息;N--返回菜单(请输入Y\\N)", "3036","\n请输入:Y--进行按学号修改学生信息;N--返回菜单(请输入Y\\N)", "3100","即将返回上一步", "3101","信息已清空,即将返回菜单\n", "3134","\n是要插入该学生信息吗?(请输入Y\\N)", "3135","\n是要删除该学生信息吗?(请输入Y\\N)", "3136","\n是要修改该学生信息吗?(请输入Y\\N)", "3200","\n现在进行按学号排序", "3201","\n现在进行按姓名排序", "3202","\n现在进行按成绩排序", "3210","\n请输入:Y--进行按学号升序排序;N--返回菜单(请输入Y\\N)", "3211","\n请输入:Y--进行按姓名升序排序;N--返回菜单(请输入Y\\N)", "3212","\n请输入:Y--进行按成绩升序排序;N--返回菜单(请输入Y\\N)", "3220","\n请输入:Y--进行按学号降序排序;N--返回菜单(请输入Y\\N)", "3221","\n请输入:Y--进行按姓名降序排序;N--返回菜单(请输入Y\\N)", "3222","\n请输入:Y--进行按成绩降序排序;N--返回菜单(请输入Y\\N)", "4001","该表为空表,请先初始化信息\n", "9999","Y--退出系统;N--返回菜单(请输入Y\\N)", };//初始化输出字库 PRINT_SET *PS=p; PRINT_SET *PB=NULL; if (strcmp(str,"0000")==0)//"0000"表示输出为空,即什么都不输出 return; if (flag) { qsort(p,sizeof(p)/sizeof(PRINT_SET),sizeof(p[0]),camp);//帮字符按编号快速排序,虽然输入可以直接人为插入排序,但也习惯做一下 flag=0; } if ((PB=(PRINT_SET *)bsearch(str,p,sizeof(p)/sizeof(PRINT_SET),sizeof(p[0]),camp))!=NULL)//bsearch函数二分法查找,提高效率 printf("%s",PB->ss2);//输出字库中要查找的字符串 } int n=0; FUN dump;//dump为空函数,闲置菜单用的 FUN fun_0_0,fun_0_1,fun_0_2,fun_0_3,fun_0_4;//菜单列表 FUN fun_1_0,fun_1_1,fun_1_2,fun_1_3,fun_1_4,fun_1_5; FUN fun_2_0,fun_2_1,fun_2_2,fun_2_3,fun_2_4; FUN fun_3_0,fun_3_1,fun_3_2,fun_3_3,fun_3_4; FUN fun_4_0,fun_4_1,fun_4_2,fun_4_3,fun_4_4,fun_4_5,fun_4_6; FUN fun_5_0,fun_5_1,fun_5_2,fun_5_3,fun_5_4; FUN fun_6_0,fun_6_1,fun_6_2,fun_6_3,fun_6_4,fun_6_5; FUN fun_7_0,fun_7_1,fun_7_2,fun_7_3; void menu(int flag,int ss,void *p,void *p2[]);//菜单信息 /*第一个参数,输入特殊值打破菜单循环(一般设置为0)~第二个参数,初始化读取菜单信息~ 第三个参数,附加一个地址(作为传参)~第四个参数,一个地址列表(感觉第三个参数可以省略)~*/ void creat();//创建,追加学生信息 void insert(Student *p);//插入学生信息 void insert_perform(Student *p1,Student *p2);//插入函数执行主体 void del(Student *p);//删除学生信息 void del_perform(Student *p);//函数执行主体 void change(Student *p);//修改学生信息~ void change_perfoem(Student *p);//函数执行主体 void sorting(int k,int (*f)(Student *p1,Student *p2,int k));//排序 int sorting_max_str(Student *p1,Student *p2,int k);//按字符串排序 int sorting_min_str(Student *p1,Student *p2,int k);//按字符串排序 int sorting_max_num(Student *p1,Student *p2,int k);//按数字排序 int sorting_min_num(Student *p1,Student *p2,int k);//按数字排序 void find_one(int k,int (*f)(Student *p1,Student *p2,int k));//查找信息 float fine_average(int k);//查找平均分 void empty_list(void *say);//清空学生信息 void file_set(void *say[],void *st,void (*f)(FILE **fp)); void save(FILE **fp);//保存学生信息 void load(FILE **fp);//读取学生信息 void ch_ferror(FILE **fp,int k);//出错处理(可以完善) void find_member(void *s,void *p,void *say[],void (*ff)(Student *),int k);//查找信息 /*第一个参数,输入格式字符串~第二个参数,输入地址~第三个参数,提示字库的关键字集合~第四个参数,指针函数(可以提高执行不同的功能)~ 第五个参数,指代抽象结构体成员*/ void judge_input(const void *s,const void *p);//判断输入合法性 int judge_continue(char *say1,char *say2);//判断是否继续执行 int judge_empty(char *say1,char *say2);//判断是否为空表 void input(Student *p);//插入学生信息 void print_one(Student *p);//输出单个关键学生信息 void print_set(const void *str);//字库函数 void print_out();//输出所有学生信息 void dump_2(Student *p);//空函数2号 Student *judge_find(void *po,int s,void *say[],void (*ff)(Student *));//查找学生信息,指针函数是为以后插入和删除学生信息作铺垫的 typedef int (*COM)();//设置菜单列表 COM A[][SIZE_FUN]= { {fun_0_0,fun_0_1,fun_0_2,fun_0_3,dump,dump,fun_0_4}, {fun_1_0,fun_1_1,fun_1_2,fun_1_3,fun_1_4,dump,fun_1_5}, {fun_2_0,fun_2_1,fun_2_2,fun_2_3,dump,dump,fun_2_4}, {fun_3_0,fun_3_1,fun_3_2,fun_3_3,dump,dump,fun_3_4}, {fun_4_0,fun_4_1,fun_4_2,fun_4_3,fun_4_4,fun_4_5,fun_4_6}, {fun_5_0,fun_5_1,fun_5_2,fun_5_3,dump,dump,fun_5_4}, {fun_6_0,fun_6_1,fun_6_2,fun_6_3,fun_6_4,dump,fun_6_5}, {fun_7_0,fun_7_1,fun_7_2,dump,dump,dump,fun_7_3}, };//菜单函数 COM (*P)[SIZE_FUN]=A; int main()//主函数 { menu(-1,0,NULL,NULL); return 0; } int fun_0_0(int ss,void *p,void *p2[])//这个是退出系统选项 { system("cls"); if (judge_continue("9999","3100")) exit(0); return ss; } int fun_0_1(int ss,void *p,void *p2[])//缓冲区 { return 1; } int fun_0_2(int ss,void *p,void *p2[])//整理信息(先要判断是否为空表) { system("cls"); if (judge_empty("4001","3100")) return 0; return 2; } int fun_0_3(int ss,void *p,void *p2[])//缓冲区 { return 3; } int fun_0_4(int ss,void *p,void *p2[])//菜单列表 { printf("请输入:\n"); printf("1:添加\\删除\\修改学生信息\n"); printf("2:整理学生信息:\n"); printf("3:存取(输出)学生信息\n"); printf("0:退出\n"); return ss; } int fun_1_0(int ss,void *p,void *p2[])//缓冲区--返回主菜单 { return 0; } int fun_1_1(int ss,void *p,void *p2[])//初始化//追加信息 { while (judge_continue("3001","3100")) creat(); Sleep(2000); return ss; } int fun_1_2(int ss,void *p,void *p2[])//按学号插入学生信息 { char *say[]={"1001","1002","1021"};//备用字库标记 char num[3]="\0"; system("cls"); while (judge_continue("3033","3100")) find_member("%s",num,say,insert,MEMBER(head->num)); Sleep(2000); return ss; } int fun_1_3(int ss,void *p,void *p2[])//按学号删除学生信息~ { char *say[]={"1001","1002","1022"}; char num[3]="\0"; system("cls"); while (judge_empty("4001","3100")==0&&judge_continue("3034","3100")) find_member("%s",num,say,del,MEMBER(head->num)); Sleep(2000); return ss; } int fun_1_4(int ss,void *p,void *p2[])//修改学生信息 { char *say[]={"1001","1002","1023"};//备用字库标记 char num[3]="\0"; system("cls"); while (judge_continue("3036","3100")) find_member("%s",num,say,change,MEMBER(head->num)); Sleep(2000); return ss; } int fun_1_5(int ss,void *p,void *p2[])//菜单列表 { printf("请输入:\n"); printf("1:初始化学生信息\n"); printf("2:按学号插入学生信息\n"); printf("3:按学号删除学生信息\n"); printf("4:按学号修改学生信息\n"); printf("0:返回上一步\n"); return ss; } int fun_2_0(int ss,void *p,void *p2[])//缓冲区 { return 0; } int fun_2_1(int ss,void *p,void *p2[])//缓冲区 { return 4; } int fun_2_2(int ss,void *p,void *p2[])//缓冲区 { return 5; } int fun_2_3(int ss,void *p,void *p2[])//缓冲区 { system("cls"); if (judge_continue("3035","3100")) empty_list("3101"); Sleep(2000); return ss; } int fun_2_4(int ss,void *p,void *p2[])//菜单列表 { printf("请选择:\n"); printf("1:查找学生信息\n"); printf("2:排序\n"); printf("3:清空学生信息\n"); printf("0:返回上一步\n"); return ss; } int fun_3_0(int ss,void *p,void *p2[])//缓冲区 { return 0; } int fun_3_1(int ss,void *p,void *p2[])//这个是保存信息 { void *say[]={"3011","3100","1030"}; system("cls"); if (judge_empty("4001","3100")) { Sleep(2000); return ss; } file_set(say,"w",save); Sleep(2000); return ss; } int fun_3_2(int ss,void *p,void *p2[])//这个是读取信息 { void *say[]={"3012","3100","1031"}; system("cls"); file_set(say,"r",load); Sleep(2000); return ss; } int fun_3_3(int ss,void *p,void *p2[])//这个是输出信息 { system("cls"); print_out(); return ss; } int fun_3_4(int ss,void *p,void *p2[])//菜单列表 { printf("请选择:\n"); printf("1:保存学生信息\n"); printf("2:读取学生信息\n"); printf("3:输出学生信息\n"); printf("0:返回上一步\n"); return ss; } int fun_4_0(int ss,void *p,void *p2[])//缓冲区 { return 2; } int fun_4_1(int ss,void *p,void *p2[])//查找最高分(如果有多个,则输出多个) { system("cls"); printf("最高分的学生信息分为:\n"); find_one(MEMBER(&head->score),sorting_max_num); system("pause"); return ss; } int fun_4_2(int ss,void *p,void *p2[])//查找最低分(如果有多个,则输出多个) { system("cls"); printf("最低分的学生信息分为:\n"); find_one(MEMBER(&head->score),sorting_min_num); system("pause"); return ss; } int fun_4_3(int ss,void *p,void *p2[])//查找平均分 { system("cls"); printf("平均分为:\n"); printf("%.2f\n",fine_average(MEMBER(&head->score))); system("pause"); return ss; } int fun_4_4(int ss,void *p,void *p2[])//这个是按学号查找 { char *say[]={"1001","1002","1010"};//备用字库标记 char num[3]="\0"; system("cls"); while (judge_continue("3031","3100")) find_member("%[^\n]%*c",num,say,print_one,MEMBER(head->num)); Sleep(2000); return ss; } int fun_4_5(int ss,void *p,void *p2[])////这个是按姓名查找 { char *say[]={"1001","1002","1011"}; char s[10]="\0"; system("cls"); while (judge_continue("3032","3100")) find_member("%[^\n]%*c",s,say,print_one,MEMBER(head->name)); Sleep(2000); return ss; } int fun_4_6(int ss,void *p,void *p2[]) { printf("请选择:\n"); printf("1:查找最高分\n"); printf("2:查找最低分\n"); printf("3:查找平均分\n"); printf("4:按学号查找\n"); printf("5:按姓名查找\n"); printf("0:返回上一步"); return ss; } int fun_5_0(int ss,void *p,void *p2[]) { return 2; } int fun_5_1(int ss,void *p,void *p2[])//这个是按学号排序 { void *s[]={"3200","3210","3220",sorting_min_str,sorting_max_str,head->num}; system("cls"); menu(0,7,NULL,s);//进入菜单 return ss; } int fun_5_2(int ss,void *p,void *p2[])//这个是按姓名排序 { void *s[]={"3201","3211","3221",sorting_min_str,sorting_max_str,head->name}; system("cls"); menu(0,7,NULL,s);//进入菜单 return ss; } int fun_5_3(int ss,void *p,void *p2[])//这个是按成绩排序 { void *s[]={"3202","3212","3222",sorting_min_num,sorting_max_num,&head->score}; system("cls"); menu(0,7,NULL,s);//进入菜单 return ss; } int fun_5_4(int ss,void *p,void *p2[])//菜单管理 { printf("请选择:\n"); printf("1:按学号排序\n"); printf("2:按姓名排序\n"); printf("3:按成绩排序\n"); printf("0:返回上一步\n"); return ss; } int fun_6_0(int ss,void *p,void *p2[])//缓冲区 { return 0; } int fun_6_1(int ss,void *p,void *p2[])//修改学号 { char *say[]={"2001","0000"}; printf("请输入学生学号"); do { judge_input("%s",((Student *)p)->num); }while (judge_find(((Student *)p)->num,MEMBER(head->num),say,print_one)!=NULL); printf("修改成功\n"); system("pause"); return ss; } int fun_6_2(int ss,void *p,void *p2[])//修改姓名 { printf("请输入学生姓名"); judge_input("%s",((Student *)p)->name); printf("修改成功\n"); system("pause"); return ss; } int fun_6_3(int ss,void *p,void *p2[])//修改成绩 { printf("请输入学生成绩"); judge_input("%d",&((Student *)p)->score); printf("修改成功\n"); system("pause"); return ss; } int fun_6_4(int ss,void *p,void *p2[])//修改全部 { input(p); n--;//这里,因为调用input函数n会+1,修改完毕后n要-1; printf("修改成功\n"); system("pause"); return ss; } int fun_6_5(int ss,void *p,void *p2[]) { printf("请选择\n"); printf("1:修改学号\n"); printf("2:修改姓名\n"); printf("3:修改成绩\n"); printf("4:修改全部\n"); printf("0:返回上一步\n"); return ss; } int dump(int ss,void *p,void *p2[]) { return ss; } int fun_7_0(int ss,void *p,void *p2[])//这个是过渡缓冲的 { return 0; } int fun_7_1(int ss,void *p,void *p2[]) { if(judge_continue(p2[1],"3100")) { sorting(MEMBER(p2[5]),p2[3]);//升序 printf("排序完毕!\n"); print_set("3100"); } Sleep(2000); return 0; } int fun_7_2(int ss,void *p,void *p2[]) { if(judge_continue(p2[2],"3100")) { sorting(MEMBER(p2[5]),p2[4]);//降序 printf("排序完毕!\n"); print_set("3100"); } Sleep(2000); return 0; } int fun_7_3(int ss,void *p,void *p2[])//选择排序方式 { print_set(p2[0]); printf("请选择排序方式:\n"); printf("1:升序\n"); printf("2:降序\n"); printf("0:返回菜单\n"); return ss; } void menu(int flag,int ss,void *p,void *p2[])//菜单函数 { while (ss!=flag) { char cmd=0;//菜单主体 system("cls"); ss=(*(*(P+ss)+SIZE_FUN-1))(ss,p,p2); cmd=getch()-'0'; if (cmd<0||cmd>SIZE_FUN-2) continue; ss=(*(*(P+ss)+cmd))(ss,p,p2); fflush(stdin); } } int judge_empty(char *say1,char *say2)//判断是否为空表 { if (n==0) { print_set(say1); print_set(say2); if (strcmp(say1,"0000")!=0) Sleep(2000); head=NULL; } return head==NULL; } void judge_input(const void *s,const void *p)//判断输入是否合法 { while (scanf(s,p)!=1) { printf("您输入的数据有误,请重新输入\n"); fflush(stdin); } fflush(stdin); } void print_one(Student *p)//输出一个学生的信息 { printf("学号:%3s\t",p->num); printf("姓名:%-10s\t",p->name); printf("成绩:%3d\t\n",p->score); } int judge_continue(char *say1,char *say2)//判断是否继续执行 { char ch=0; while (1) { print_set(say1); ch=getch(); system("cls"); if (ch=='Y'||ch=='y') return 1; else if (ch=='N'||ch=='n') { print_set(say2); return 0; } else printf("\n判断只能在Y和N之间选择,请重新输入:"); } } Student *judge_find(void *po,int s,void *say[],void (*ff)(Student *))//查找学生信息 { Student *p=head; while (p) { if (strcmp(po,(char *)p+s)==0&&p!=po)//通过字符串比较 { print_set(say[0]); (*ff)(p);//调用指针函数 return p;//这个返回值作用不大~~其实是判断是否找到该学生信息 } p=p->date; } print_set(say[1]); return NULL; } void dump_2(Student *p)//这个空函数是用来缓冲的~ { } void creat()//创建//追加信息 { Student *p=head; if (judge_empty("0000","0000")) { p=head=(Student *)malloc(LEN);//判断空表 head->date=NULL; head->back=NULL; } else { while (p->date) //追加信息 { p->date->back=p; p=p->date; } p->date=(Student *)malloc(LEN); p->date->back=p; p=p->date; p->date=NULL; } printf("现在正在创建第%d个学生的信息\n\n",n+1); input(p); printf("添加成功……\n"); } void input(Student *p)//输入信息 { char *say[]={"2001","0000"};//初始化字库标记 n++; printf("请输入学生学号"); do { judge_input("%s",p->num); }while (judge_find(p->num,MEMBER(head->num),say,print_one)!=NULL); printf("请输入学生姓名"); judge_input("%s",p->name); printf("请输入学生成绩"); judge_input("%d",&p->score); } void print_out()//输出信息 { Student *p=head; if (judge_empty("4001","3100")) return; printf("现在统计人数有%d人\n",n); while (p) { print_one(p); p=p->date; } system("pause"); } void insert(Student *p)//插入函数 { Student *pi=NULL; print_one(p); printf("\n"); if (judge_continue("3134","3100")==0) return; pi=(Student *)malloc(LEN); input(pi); insert_perform(p,pi); printf("插入成功!\n"); return; } void insert_perform(Student *p1,Student *p2)//插入执行主体 { if (p1==head) { p2->date=head; p2->back=NULL; head->back=p2; head=p2; return; } p2->back=p1->back; p1->back->date=p2; p2->date=p1; p1->back=p2; return; } void del(Student *p)//删除函数 { print_one(p); printf("\n"); if (judge_continue("3135","3100")==0) return; del_perform(p); printf("该学生信息已成功删除!\n"); system("pause"); return; } void del_perform(Student *p)//删除执行主体 { if (p==head&&p->date==NULL)//当只有一个节点时 { free(p); head=NULL; n--; } else if (p==head&&p->date!=NULL)//当删除节点在头指针并且不止一个节点时 { p=p->date; free(p->back); p->back=NULL; head=p; n--; } else if (p->date!=NULL) { p->back->date=p->date;//一般情况下 p->date->back=p->back; free(p); n--; } else { p->back->date=NULL;//当删除节点在尾部时 free(p); n--; } } void change(Student *p)//修改函数 { print_one(p); printf("\n"); if (judge_continue("3136","3100")==0) return; menu(0,6,p,NULL);//调用菜单 } void find_member(void *s,void *p,void *say[],void (*ff)(Student *),int k)//按关键信息查找 { print_set(say[2]); judge_input(s,p); judge_find(p,k,say,ff); } void empty_list(void *say)//清空信息 { Student *p=head; if (judge_empty("4001","3100")) { Sleep(2000); return; } while (p->date) { p=p->date; free(p->back); n--; } free(p); n--; head=NULL; print_set(say); return; } float fine_average(int k)//查找平均分 { Student *p=head; float ave=0; while (p) { ave+=*((char *)p+k); p=p->date; } return ave/n; } void sorting(int k,int (*f)(Student *p1,Student *p2,int k))//排序 { Student *p1=head; Student *p2=head; Student *p3=head; Student *pt=head; while (p3->date) { p1=p2=p3; while (p1->date) { if (f(p1,p2,k))//具体排序规则 p2=p1; p1=p1->date; } if (p2!=p3) { pt=(Student *)malloc(LEN); *pt=*p2; insert_perform(p3,pt);//插入 del_perform(p2);//删除 n++;//后续处理~ } else p3=p3->date; } } int sorting_max_str(Student *p1,Student *p2,int k)//从大到小排--字符串排序 { if (strcmp((char *)p1+k,(char *)p2+k)>0) return 1; return 0; } int sorting_min_str(Student *p1,Student *p2,int k)//从小到大排 { if (strcmp((char *)p1+k,(char *)p2+k)<0) return 1; return 0; } int sorting_max_num(Student *p1,Student *p2,int k)//内容排序 { if (*((char *)p1+k)>*((char *)p2+k)) return 1; return 0; } int sorting_min_num(Student *p1,Student *p2,int k) { if (*((char *)p1+k)<*((char *)p2+k)) return 1; return 0; } void find_one(int k,int (*f)(Student *p1,Student *p2,int k))//查找信息 { Student *p1=head; Student *p2=head; while (p1) { if (f(p1,p2,k))//具体查找规则 p2=p1; p1=p1->date; } p1=head; while (p1) { if (strcmp((char *)p1+k,(char *)p2+k)==0) print_one(p1); p1=p1->date; } } void file_set(void *say[],void *st,void (*f)(FILE **fp))//文件初始化数据~ { FILE *fp=NULL; int flag=0; char s[100]="\0"; if (judge_continue(say[0],say[1])==0) return; print_set(say[2]); judge_input("%[^\n]%*c",s); if ((fp=fopen(s,st))==NULL) { printf("无法打出此文件\n"); print_set("3100"); Sleep(2000); return; } f(&fp); } void ch_ferror(FILE **fp,int k)//简单判断文件读写是否出错(这个可以完善) { if (ferror(*fp)||k==0) { printf("警告,文件录入异常!\n"); system("pause"); clearerr(*fp); } } void save(FILE **fp)//保存数据 { Student *p=head; int flag=0; while (p) { ch_ferror(fp,fprintf(*fp,"%s ",p->num));//检查文件是否录入异常 ch_ferror(fp,fprintf(*fp,"%s ",p->name)); ch_ferror(fp,fprintf(*fp,"%d\n",p->score)); p=p->date; } printf("保存完毕\n"); fclose(*fp); print_set("3100"); return; } void load(FILE **fp)//读取数据 { Student *p=head;// int flag=0; if (judge_empty("0000","0000")==0) empty_list("0000"); n=1; p=head=(Student *)malloc(LEN);//为头节点分配空间 p->back=NULL; while (1) { ch_ferror(fp,fscanf(*fp,"%s ",p->num)); ch_ferror(fp,fscanf(*fp,"%s ",p->name)); ch_ferror(fp,fscanf(*fp,"%d%*c",&p->score));//%*c可以不要~~~ if (feof(*fp)) break; p->date=(Student *)malloc(LEN); p->date->back=p; p=p->date; n++; } n--; p=p->back;//读取完毕人数要要减1~ free(p->date); p->date=NULL; printf("读取完毕\n"); fclose(*fp); print_set("3100"); return; }
[此贴子已经被作者于2017-1-6 09:23编辑过]
[此贴子已经被作者于2017-1-6 09:27编辑过]