职工信息管理系统中的数据保存问题
程序代码:
/***************************************************************************************** * 职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。 * * 试设计一职工信息管理系统,使之能提供以下功能: * * 1)系统以菜单方式工作 * * 2)职工信息录入功能(职工信息用文件保存)--输入 * * 3)职工信息浏览功能--输出 * * 4)职工信息查询功能--算法 * * 查询方式: * * ①按学历查找 * * ②按职工号查找 * * 5)职工信息删除、修改功能 * * * * * * * *****************************************************************************************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #define LEN sizeof(work) typedef struct worker { long no;//职工号 char name[10]; char sex[1]; int age; char edu[5];//学历 float wages; char address[30]; long long number;//电话 struct worker *next; }work; int n; //函数声明区 work *creat(void);//创建链表 work *input(work *head,work *p1);//输入职工信息 work *insert(work *head,work *workd);//插入职工信息 work *changes(work *head); work *del(work *head, long num); void search(work *head); void save(work *head);//保存职工信息到文件 void print(work *head);//打印出职工信息 void numsearch(work *head,long num); void namesearch(work *head,char name[]); //函数编写区 work *creat(void)//新建职工信息 { work *head,*p1; n=0; p1=(work *)malloc(LEN); printf("请输入职工信息!\n"); head=NULL; p1=input(head,p1); while(p1->no!=0) { head=insert(head,p1); p1=(work *)malloc(LEN); p1=input(head,p1); } return head; } work *input(work *head,work *p1)//输入职工信息 { int i,f,k,j; work *p2; loop:printf("职工号(输入0返回上一级): "); scanf("%ld",&p1->no); if(p1->no<0) { printf("职工号不能为负,请重新输入!\n"); goto loop; } else { if(p1->no==0) return (p1); else { p2=head; f=0; for(i=1;i<=n;i++) { if(p1->no==p2->no) { f=1; break; } p2=p2->next; } } if(f) { printf("职工号重复,请重新输入!\n"); goto loop; } } printf("姓名:"); scanf("%s",p1->name); printf("性别:"); scanf("%s",&p1->sex); printf("年龄:"); scanf("%d",&p1->age); printf("学历:"); scanf("%s",p1->edu); printf("工资:"); scanf("%f",&p1->wages); printf("家庭住址:"); scanf("%s",p1->address); printf("联系方式:"); scanf("%lld",&p1->number); return (p1); } work *insert(work *head,work *workd) { work *p0,*p1,*p2; p1=head;//指向链表头部 p0=workd;//指向要插入的结点 if(head==NULL)//如果为空,直接插入到第一个结点 { head=p0; p0->next=NULL; } else { while((p0->number>p1->number)&&(p1->next!=NULL)) { p2=p1; p1=p1->next; } if(p0->number<=p1->number) { if(head==p1)//插入的结点在第一个结点之前 head=p0; else//插入的结点在中间 p2->next=p0; p0->next=p1; } else//插入的结点在最后 { p1->next=p0; p0->next=NULL; } } n=n+1;; return (head); } work *changes(work *head) { work *p1; int k; long num; do{ printf("1.删除 2.插入 0.返回上一级\n"); printf("请选择:"); scanf("%d",&k); switch(k) { case 1:if(n==0) { printf("数据库为空,没有职工信息!!\n"); break; } else do{ printf("请输入要删除的职工的职工号(职工号应为整数,输入0时跳出删除元素):"); scanf("%ld",&num); if(num>0) head=del(head,num); if(num<0) printf("职工号不能为负,请重新输入!\n"); }while(num!=0); break; case 2:printf("请输入学生信息:\n"); p1=(work *)malloc(LEN); p1=input(head,p1); while(p1->no!=0) { head=insert(head,p1); printf("请输入学生信息:\n"); p1=(work *)malloc(LEN); p1=input(head,p1); } break; case 0: break; default:printf("输入错误,请重新输入!\n"); } }while(k!=0); return head; } work *del(work *head,long num) { work *p1,*p2; if(head==NULL) { printf("数据库为空,没有职工信息!\n"); } else { p1=head; while(p1->no!=num&&p1->next!=NULL) { p2=p1; p1=p1->next; } if(num==p1->no) { if(p1==head) { head=p1->next; printf("删除成功!\n"); } else { p2->next=p1->next; printf("删除成功!\n"); } n=n-1; free(p1); } else printf("没有找到职工号为%d的职工信息!\n",num); } return head; } void print(work *head)//打印职工信息 { int j; work *p1; if(n==0) { printf("数据库为空!\n"); return; } p1=head; if(head!=NULL) { do{ printf("职工号:%ld\n",p1->no); printf("姓名:%s\n",p1->name); printf("性别:%s\n",p1->sex); printf("年龄:%d\n",p1->age); printf("学历:%s\n",p1->edu); printf("薪水:%f\n",p1->wages); printf("家庭住址:%s\n",p1->address); printf("联系方式:%lld\n",p1->number); p1=p1->next; }while(p1!=NULL); } } void save(work *head)//保存文件时候有问题 { FILE *fp; work *p1; if(n==0) { printf("没有职工信息!请先建立职工信息!!\n"); return; } if((fp=fopen("职工信息.txt","r+"))==NULL) { printf("不能打开文件!!\n"); exit(0); } for(p1=head;p1!=NULL;p1=p1->next) { fprintf(fp,"职工号:%ld\n姓名:%s\n性别:%s\n年龄:%d\n学历:%s\n薪水:%f\n家庭住址:%s\n联系方式:%lld\n",p1->no,p1->name,p1->sex,p1->age,p1->edu,p1->wages,p1->address,p1->number); //职工数据写入文件中 printf("保存成功!\n"); fclose(fp); } } void search(work *head) { int k; long num; char name[10]; if(n==0) { printf("数据库为空,没有职工信息!!\n"); return; } else { do{ printf("1.按职工号查找 2.按姓名查找 0.返回上一级\n"); printf("请选择:"); scanf("%d",&k); switch(k) { case 1:do{ printf("职工号(输入0时跳出):"); scanf("%ld",&num); if(num>0) numsearch(head,num); if(num<0) printf("输入错误,请重新输入!\n"); }while(num!=0); break; case 2:do{ printf("姓名(输入0时跳出):"); scanf("%s",name); namesearch(head,name); }while(strcmp(name,"0")!=0); break; default:printf("输入错误,请重新输入!\n"); } }while(k!=0); } } void numsearch(work *head,long num) { work *p1; p1=head; while(p1!=NULL) { if(num==p1->no) { printf("职工号:%ld\n",p1->no); printf("姓名:%s\n",p1->name); printf("性别:%s\n",p1->sex); printf("年龄:%d\n",p1->age); printf("学历:%s\n",p1->edu); printf("薪水:%f\n",p1->wages); printf("家庭住址:%s\n",p1->address); printf("联系方式:%lld\n",p1->number); return; } p1=p1->next; } printf("没有找到该职工的信息\n"); } void namesearch(work *head,char name[]) { int a=1; work *p1; p1=head; while(p1!=NULL) { if(strcmp(name,p1->name)==0) { printf("职工号:%ld\n",p1->no); printf("姓名:%s\n",p1->name); printf("性别:%s\n",p1->sex); printf("年龄:%d\n",p1->age); printf("学历:%s\n",p1->edu); printf("薪水:%f\n",p1->wages); printf("家庭住址:%s\n",p1->address); printf("联系方式:%lld\n",p1->number); a=0; } p1=p1->next; } if(a) printf("没有找到该职工的信息\n"); } void main()//菜单 { int choice; work *head; head=NULL; do{ printf("*******************************************************************************\n"); printf("^_^_^_^_^_^_^_^_^_^_^_^_^_^欢迎来到职工信息管理系统!^_^_^_^_^_^_^_^_^_^_^_^_^_^\n"); printf(" \n"); printf(" 职工信息管理系统的基本功能: \n"); printf(" 1. 新建; \n"); printf(" 2. 查找; \n"); printf(" 3. 更新; \n"); printf(" 4. 显示; \n"); printf(" 5. 存盘; \n"); printf(" 0. 跳出; \n"); printf(" \n"); printf(" 按键选择,回车确定! \n"); printf("^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^\n"); printf("*******************************************************************************\n"); printf("请选择:"); scanf("%d",&choice); switch(choice) { case 1: head=creat(); break; case 2: search(head); break; case 3: head=changes(head); break; case 4: print(head); break; case 5: save(head); break; case 0: printf("谢谢你的使用!!\n"); break; } }while(choice!=0); } 在输入多次数据之后,文件保存的时候就只保存最后一次的输入数据,还有在插入数据的时候,插入多组数据,也只是保存最后一次数据。问问大佬们错在了哪里~~~~~~ 【不知道怎么回事代码复制上去格式有点乱,希望大佬们不要介意】
[此贴子已经被作者于2017-5-6 11:34编辑过]