排序和删除运行后会突然停止工作,求大神搭救。本人C语言菜鸟一枚,刚学C,写了个比较粗糙的系统,代码也是有参考别人的。毕竟水平有限,希望能有大神,帮我看看,指出其中的毛病。好的差的评价与建议都可留下,能给我留评论的都不甚感激,我一定会参考大家的意见,做出改进,努力地进步的.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*-----------------------定义职工结构体-----------------------*/
struct workerinf //职工信息
{
char name[30]; //职工姓名
char sex[4];
int ID; //职工工号
double salary1,salary2,salary3; //基本工资,奖金,扣款
double yfgz; //保存职工应发工资
double sk; //保存职工税款
double sfgz; //保存职工实发工资
};
struct workerlink //职工信息链节点
{
char name[30];
char sex[4];
int ID;
double salary1,salary2,salary3;//基本工资,奖金,扣款
double yfgz; //保存职工应发工资
double sk; //保存职工税款
double sfgz; //保存职工实发工资
struct workerlink *next;
};
int sizeworker=sizeof(struct workerinf);
int sizeworlink=sizeof(struct workerlink);
/*------------------------计算文件长度-------------------------*/
int FileLenth(FILE *fp)
{
long flen;
fseek(fp,0L,2); /*到文件末尾*/
flen=ftell(fp); /*取位置*/
rewind(fp); /*回到文件头*/
return flen;
}
/*------------------检测工号是否存在,若存在返回 1---------------*/
int exist(int n,FILE *fp)
{ struct workerinf*p;
int cz=0;
p=(struct workerinf*)malloc(sizeworker); /*申请一个新节点,用于读文件内容*/
rewind(fp);
while(!feof(fp))
{
fread(p,sizeworker,1,fp); /*读出文件内容*/
if(p->ID==n)
{cz=1;break;}
}
return cz;
}
/*-------------------------录入文字---------------------------*/
void InputWord(char *lx,char *p)
{
char word[20];
printf("请输入%s:",lx);
scanf("%s",word);
strcpy(p,word);
}//该函数的设定是为了后面编写代码不用重复啰嗦,以体现代码的简洁性
/*--------------------录入职工的工资-------------------------*/
float InputResult(char *lx,float d1,float d2)
{
float result;
printf("请输入职工%s:",lx);
scanf("%f",&result);
while(result>d2||result<d1)
{
printf("%s在%6.2f--%6.2f之间,请重新输入:",lx,d1,d2);
scanf("%f",&result);
}
return (result);
}//为了防止恶意操作,使操作系统更加的人性化。
/*--------------------创建职工数据表-----------------------*/
void CreatWorker()
{
long start,filelen; //定义long型位移量start
FILE *fp; //定义一个指向文件的指针变量
struct workerinf *w; //定义一个职工信息的结构体变量,用于记录职工信息
int amount=0; //记录职工个数
if((fp=fopen("staff","a+"))==NULL) fp=fopen("staff","w+");//将fopen函数返回值(指向staff文件的指针,即staff文件信息区的起始地址)
start=FileLenth(fp); //FileLenth函数利用fp测出staff文件信息区的长度赋给start。
w=(struct workerinf*)malloc(sizeworker);
//申请一个结构体空间,用于记录职工的数据。
while(1) //如果真,就执行while循环
{
printf("请输入职工的工号(输入0返回主菜单):\n");
scanf("%d",&w->ID);
if(w->ID==0) //用户输入0,退出
{
if (amount==0)
break; //无数据输入,直接退出,不用在退出前打印新录入的数据。
filelen=FileLenth(fp);//做为后面打印出刚输入的信息的参数
fseek(fp,start,0); /*在退出前,将文件位置标记向前移动到离文件开头start个字节处.即文件尾。*/
printf("|工号\t|姓名\t|性别\t|基本工资|奖金\t |扣款\t|应发工资|税款\t|实发工资|\n");
while(ftell(fp)<filelen) /*如果ftell(fp)计算出的此时文件位置标记的位置<staff文件长度执行while循环将新录入的内容打印出来。*/
{
fread(w,sizeworker,1,fp); /*fread函数从fp所指向文件缓冲区的文件读入1个sizewoker个字节的数据,存储到w结构体中。即读出文件的内容。*/
printf("|%d\t|%s\t|%s\t|%6.2f|%6.2f|%6.2f|%6.2f|%6.2f|%6.2f|\n",w->ID,w->name,w->sex,w->salary1,w->salary2,w->salary3,w->yfgz,w->sk,w->sfgz);
}//在退出前将新录入的数据打印出来。
break;//终止本次循环,直接退出输入数据的界面。
}
if(w->ID<0)
{
printf("\n输入的工号不能为0,请您重新输入:\n");
continue;//结束本次循环。
}
if(exist(w->ID,fp)==1) //检测工号是否存在。
{
printf("\n输入的工号已经存在!请您重新输入:\n");
continue;
}
InputWord("姓名",w->name); //录入数据
InputWord("性别",w->sex);//录入数据
w->salary1=InputResult("基本工资",2000,10000);//录入数据
w->salary2=InputResult("奖金",1000,5000);//录入数据
w->salary3=InputResult("扣款",100,1000);//录入数据
w->yfgz=w->salary1+w->salary2-w->salary3;//计算出应发的工资
w->sk=w->yfgz*(0.05);//计算税款
w->sfgz=w->yfgz*(0.95);//计算实发工资
printf("职工工资信息录入完成,请查看:\n\n");
printf("|%d\t|%s\t|%s\t|%6.2f|%6.2f|%6.2f|%6.2f|%6.2f|%6.2f|\n",w->ID,w->name,w->sex,w->salary1,w->salary2,w->salary3,w->yfgz,w->sk,w->sfgz);
fwrite(w,sizeworker,1,fp);//把数据写入staff磁盘文件
printf("系统已自动保存该职工的信息...\n\n");
amount++;
}
fclose(fp);
}
/*-------------------------查找职工的数据-----------------------*/
void xmcz()//按姓名查找
{
FILE *fp;
struct workerinf *w;
char name[20];
int n=0;
void search();
if((fp=fopen("staff","r+"))==NULL) {printf("无数据可查\n");return;}
while(1)
{
printf("请输入要查找的职工的姓名(输入0返回上一步):");
scanf("%s",name);
if(name[0]=='0') break;//退出循环.退出按姓名查找的界面.
rewind(fp); //由于打开文件时,文件位置标记移动到了文件尾,因此将标记移动回文件开头。
while(!feof(fp)) //打印找到的数据
{ w=(struct workerinf*)malloc(sizeworker); //申请一个新节点,用于读文件内容