文件读取和存储链表数据问题
职工管理系统的作业,需要将链表数据从文件中读取和保存。请大神帮忙看看,读取和保存函数错在哪~~谢谢
程序代码:#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct staff
{
int number;
char name[10];
char sex[3];
int age;
char education[10];
int wage;
char adress[40];
char phone[15];
struct staff *next;
}staff;
struct staff *sta_first,*sta_end;
char gasave,gfirst;
int i=1;
int add();
int find();
int dele();
void exit();
void show();
int modify();
int select();
void welcome();
void readdata();
void savedata();
struct staff* findedu(char *name);
struct staff* findwage(int num);
void displaysta(struct staff *sta,char *field,char *name);
void welcome()
{
printf("* * * * * * * * * * * * * * * * * * * * * *\n");
printf(">>>>>>>>>>>欢迎进入职工管理系统<<<<<<<<<<<<\n");
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");
}
int add()
{
FILE *fp;
struct staff *sta;
int i=0;
char choice='y';
if((fp=fopen("E:\\staff.txt","ab"))==NULL)
{
printf("打开文件staff.txt出错!\n");
getchar();
return-1;
}
do{
sta=(struct staff*)malloc(sizeof(struct staff));
if(sta==NULL)
{
printf("内存分配失败,按任意键退出!\n");
getchar();
return-1;
}
printf("请输入职工的信息~\n");
printf("___________________________\n");
printf("工号: ");
scanf("%d",&sta->number);
printf("姓名: ");
scanf("%s",&sta->name);
printf("性别: ");
scanf("%s",&sta->sex);
printf("年龄: ");
scanf("%d",&sta->age);
printf("学历: ");
scanf("%s",&sta->education);
printf("工资: ");
scanf("%d",&sta->wage);
printf("住址: ");
scanf("%s",&sta->adress);
printf("电话: ");
scanf("%s",&sta->phone);
sta->next=NULL;
if(sta_first==NULL)
{
sta_first=sta;
sta_end=sta;
}
else
{
sta_end->next=sta;
sta_end=sta;
}
fwrite(sta_end,sizeof(staff),1,fp);
gfirst=0;
printf("\n");
printf("___________________________\n");
printf("\n是否继续输入?(y/n)");
fflush(stdin);
choice=getchar();
if(choice!='y')
{
fclose(fp);
printf("\n输入完毕,按任意键返回\n");
system("pause");
return-1;
}
system("cls");
}while(1);
}
int dele()
{
int findok=0;
struct staff *sta1,*sta2;
char name[10],choice;
system("cls");
printf("\n请输入要删除的员工姓名: ");
scanf("%s",name);
sta1=sta_first;
sta2=sta1;
while(sta1)
{
if(strcmp(sta1->name,name)==0)
{
findok=1;
system("cls");
printf("员工: %s的信息如下:\n",sta1->name);
printf("___________________________\n");
printf("员工: %d\n",sta1->number);
printf("姓名: %s\n",sta1->name);
printf("性别: %s\n",sta1->sex);
printf("年龄: %d\n",sta1->age);
printf("学历: %s\n",sta1->education);
printf("工资: %d\n",sta1->wage);
printf("住址: %s\n",sta1->adress);
printf("电话: %s\n",sta1->phone);
printf("___________________________\n");
printf("您真的要删除该员工吗?(y/n)");
fflush(stdin);
choice=getchar();
if(choice!='y'&&choice!='Y')return-1;
if(sta1==sta_first) sta_first=sta1->next;
else sta2->next=sta1->next;
free(sta1);
gasave=1;
return-1;
}
else
{
sta2=sta1;
sta1=sta1->next;
}
}
if(!findok)
{
printf("___________________________\n");
printf("\n没有找到姓名是: %s的信息!\n",name);
system("pause");
}
return-1;
}
int find()
{
int choice,ret=0,num;
char str[13];
struct staff *sta1;
system("cls");
do{
printf("\t查询职工信息\n");
printf("___________________________\n");
printf("\t1.按工资查询\n");
printf("\t2.按学历查询\n");
printf("\t0.返回主菜单\n");
printf("___________________________\n");
printf("\n请选择菜单: ");
do{
fflush(stdin);
choice=getchar();
switch(choice)
{
case'1':
printf("\n输入要查询的职工工资: ");
scanf("%d",&num);
sta1=findwage(num);
itoa(num,str,10);
displaysta(sta1,"工资",str);
break;
case'2':
printf("\n输入要查询的职工学历: ");
scanf("%s",str);
sta1=findedu(str);
displaysta(sta1,"学历",str);
break;
case'0':
ret=1;
break;
}
}while(choice<'0'||choice>'2');
if(ret) break;
}while(1);
return-1;
}
struct staff *findwage(int num)
{
struct staff *sta1;
sta1=sta_first;
while(sta1)
{
if(num==sta1->wage)return sta1;
sta1=sta1->next;
}
return NULL;
}
struct staff *findedu(char *name)
{
struct staff *sta1;
sta1=sta_first;
while(sta1)
{
if(strcmp(name,sta1->education)==0)return sta1;
sta1=sta1->next;
}
return NULL;
}
int modify()
{ int id;
struct staff *q;
struct staff *h = NULL;
printf("请输入职工号(数字):");
scanf("%d",&id);
h=sta_first;
while(h)
{
if(h->number==id)
{
break;
}
h=h->next;
}
if(h == NULL)
{
printf("找不到此职工,请重试\n");
system("pause");
return-1;
}
printf("___________________________\n");
printf("请输入职工姓名:");
scanf("%s",&h->name);
printf("请输入职工性别:");
scanf("%s",&h->sex);
printf("请输入职工年龄:");
scanf("%d",&h->age);
printf("请输入职工学历:");
scanf("%s",&h->education);
printf("请输入职工工资:");
scanf("%d",&h->wage);
printf("请输入职工住址:");
scanf("%s",&h->adress);
printf("请输入职工电话:");
scanf("%s",&h->phone);
q=sta_first;
while(q)
{
if(h->number==id)
{
break;
}
q=q->next;
}
q=h;
printf(".^_^.修改成功!.^_^.\n");
system("pause");
return-1;
}
void displaysta(struct staff *sta,char *field,char *name)
{
if(sta)
{
printf("\n%s:%s信息如下: \n",field,name);
printf("___________________________\n");
printf("员工: %d\n",sta->number);
printf("姓名: %s\n",sta->name);
printf("性别: %s\n",sta->sex);
printf("年龄: %d\n",sta->age);
printf("学历: %s\n",sta->education);
printf("工资: %d\n",sta->wage);
printf("住址: %s\n",sta->adress);
printf("电话: %s\n",sta->phone);
printf("___________________________\n");
}
else
{
printf("___________________________\n");
printf("资料库中没有%s为: %s的职工!请重新确认!\n",field,name);
system("pause");
}
}
int select()
{
int choice;
choice=getchar();
switch(choice)
{
case'1':add();break;
case'2':find();break;
case'3':modify();break;
case'4':dele();break;
case'5':show();break;
case'0':system("cls");printf("欢迎使用!\n");
i=0;
break;
default:return -1;
}
return-1;
}
void readdata()
{
FILE *fp;
if((fp=fopen("E:\\staff.txt","rb"))==NULL)
{
printf("无法打开文件!\n");
return;
}
struct staff *p,*q;
p=(struct staff*)malloc(sizeof(struct staff));
sta_first=p;
sta_first->next=NULL;
while(!feof(fp))
{
q=(struct staff*)malloc(sizeof(struct staff));
fscanf(fp,"%d",&p->number);
fscanf(fp,"%s",&p->name);
fscanf(fp,"%s",&p->sex);
fscanf(fp,"%d",&p->age);
fscanf(fp,"%s",&p->education);
fscanf(fp,"%d",&p->wage);
fscanf(fp,"%s",&p->adress);
fscanf(fp,"%s",&p->phone);
p->next=q;
p=q;
}
q->next=NULL;
if(fclose(fp))
{
printf("文件异常关闭");
return;
}
}
void savedata()
{
FILE *fp;
if((fp=fopen("E:\\staff.txt","ab"))==NULL)
{
printf("无法打开文件!\n");
return;
}
struct staff *p;
p=sta_first->next;
while(p!=NULL)
{
fprintf(fp,"%d",p->number);
fprintf(fp,"%s",p->name);
fprintf(fp,"%s",p->sex);
fprintf(fp,"%d",p->age);
fprintf(fp,"%s",p->education);
fprintf(fp,"%d",p->wage);
fprintf(fp,"%s",p->adress);
fprintf(fp,"%s",p->phone);
p=p->next;
}
if(fclose(fp))
{
printf("文件异常关闭!");
return;
}
}
void show()
{
struct staff *sta;
sta=sta_first;
printf("浏览职工信息\n");
while(sta->next!=NULL)
{
printf("___________________________\n");
printf("员工: %d\n",sta->number);
printf("姓名: %s\n",sta->name);
printf("性别: %s\n",sta->sex);
printf("年龄: %d\n",sta->age);
printf("学历: %s\n",sta->education);
printf("工资: %d\n",sta->wage);
printf("住址: %s\n",sta->adress);
printf("电话: %s\n",sta->phone);
printf("___________________________\n");
sta=sta->next;
}
printf("显示完毕!\n");
system("pause");
}
int main()
{
sta_first=NULL;
sta_end=NULL;
gfirst=0;
readdata();
for(;i==1;)
{
system("cls");
welcome();
select();
}
return 0;
}






