#include<stdio.h>
#include<string.h>
#include <stdlib.h>
//显示界面
void show()
{
int i=0;
for(i=0;i<50;i++)
printf("*");
printf("\n*");
for(i=0;i<15;i++)
printf(" ");
printf("人员信息管理系统");
for(i=0;i<17;i++)
printf(" ");
printf("*\n");
for(i=0;i<50;i++)
printf("*");
printf("\n*");
for(i=0;i<10;i++)
printf(" ");
printf("1.录入信息");
for(i=0;i<10;i++)
printf(" ");
printf("2.按id查询 *\n*");
for(i=0;i<10;i++)
printf(" ");
printf("3.按姓名精确查询");
for(i=0;i<4;i++)
printf(" ");
printf("4.按姓名模糊查询 *\n*");
for(i=0;i<10;i++)
printf(" ");
printf("5.更改信息");
for(i=0;i<10;i++)
printf(" ");
printf("6.删除信息 *\n*");
for(i=0;i<10;i++)
printf(" ");
printf("7.显示成员信息");
printf(" 0.退出 *\n");
for(i=0;i<50;i++)
printf("*");
printf("\n");
}
//判断字符匹配&&*(str1+j)
int indexof(const char *str,const char *str1)
{
int i=0,j=0;
for(i=0;*(str+i);i++)
{
if(*(str+i)==*(str1+j)) //相等并且str1还未结束则继续
{
j++;
if(!*(str1+j)) //str1已经到末尾了,比较结束,找到了,返回1
return 1;
}
else //在比较的中途某个字符不相等,则重新从str的下一个字符开始比较
{
j=0;
}
}
return 0;
}
//录入信息
int save()
{
int num=0,id1,id=0,pos=0,flag;//id是输入的,id1是文件中读出来的
char name[20],buf[20];
float salary=0.0f;
FILE *fp=fopen("a.bin","ab+");
if(!fp)
{
printf("文件打开失败\n");
return 0;
}
while(1)
{
flag=0;
printf("请输入人员id:");
scanf("%d",&id);
scanf("%*[^\n]");
scanf("%*c");
/*for(pos=0;pos<num;pos++)
{
if(id==ids[pos])
break;
}
if(pos<=num-1)
{
printf("用户id已存在,请重新输入!\n");
continue;
}
*/
rewind(fp);
while(fread(&id1,sizeof(int),1,fp))
{
if(id1==id)//如果文件中已经存在该id则将flag置为1作为标记
{
flag=1;
break;
}
fseek(fp,24,SEEK_CUR);
}
if(flag==1)
continue;
printf("请输入人员姓名:");
scanf("%s",name);
//fgets(name,20,stdin);
if(strlen(name)==19&&name[18]!='\n')
{
scanf("%*[^\n]");
scanf("%*c");
}
//if(name[strlen(name)-1]=='\n')
//name[strlen(name)-1]='\0';
printf("请输入人员工资:");
scanf("%g",&salary);
scanf("%*[^\n]");
scanf("%*c");
fseek(fp,0,SEEK_END);
fwrite(&id,sizeof(int),1,fp);
fwrite(name,sizeof(char),20,fp);
fwrite(&salary,sizeof(float),1,fp);
//ids[num]=id;
num++;
printf("是否要录入下一个员工信息:(y/Y继续)");
fgets(buf,20,stdin);
if(strlen(buf)==19&&buf[18]!='\n')
{
scanf("%*[^\n]");
scanf("%*c");
}
if(buf[0]!='y'&&buf[0]!='Y')
{
break;
}
}
fclose(fp);
fp=NULL;
//system("CLS");
return num;
}
//按照id查询
void id_query()
{
int id=0,id1=0,length=0;
char name[20];
float salary=0.0f;
FILE *fp=NULL;
system("clear");
printf("请输入要查询的人员的id:");
scanf("%d",&id1);
fp=fopen("a.bin","rb");
if(fp)
{
fseek(fp,0,SEEK_END);
length=ftell(fp);
rewind(fp);
while(ftell(fp)<length)
{
fread(&id,sizeof(int),1,fp);
if(id==id1)
{
fread(name,sizeof(char),20,fp);
fread(&salary,sizeof(float),1,fp);
system("CLS");
printf("id存在,查询成功!\n");
printf("您查询的人员的信息如下\n");
printf("******************************************\n");
printf("* id\t\tname\t\tsalary *\n");
printf("******************************************\n");
printf("* %d\t\t%s\t\t%g *\n",id,name,salary);
printf("******************************************\n");
//printf("\tid\t姓名\t工资\n");
//printf("\t%d\t%s\t%g\n\n",id,name,salary);
break;
}
fseek(fp,24,SEEK_CUR);
if(ftell(fp)>=length)
{
printf("id不存在,查询失败!\n");
}
}
fclose(fp);
fp=NULL;
}
}
//按姓名精确查询
void name_query()
{
char name[20],name1[20];
int length=0,id=0,flag=0;//flag=0表示没找到,默认没找到
float salary=0.0f;
system("clear");
printf("请输入要查询的人员姓名:");
//fgets(name1,20,stdin);
scanf("%s",name1);
if(strlen(name1)==19&&name1[18]!='\n')
{
scanf("%*[^\n]");
scanf("%*c");
}
//if(name[strlen(name)-1]=='\n')
//name[strlen(name)-1]='\0';
FILE *fp=fopen("a.bin","rb");
if(fp)
{
while(fread(&id,sizeof(int),1,fp))
{
fread(name,sizeof(char),20,fp);
fread(&salary,sizeof(float),1,fp);
if(!strcmp(name1,name))
{
system("CLS");
printf("存在该用户,查询成功!\n");
printf("您查询的人员的信息如下\n");
printf("******************************************\n");
printf("* id\t\tname\t\tsalary *\n");
printf("******************************************\n");
printf("* %d\t\t%s\t\t%g *\n",id,name,salary);
printf("******************************************\n");
//printf("\tid\t姓名\t工资\n");
//printf("\t%d\t%s\t%g\n\n",id,name,salary);
flag=1;
}
}
if(flag==0)
{
printf("姓名不存在,查询失败!\n");
}
fclose(fp);
fp=NULL;
}
}
//按姓名模糊查询
void m_name_search()
{
char name[20],name1[20];
int length=0,id=0,flag=0;//flag=0表示没找到,默认没找到
float salary=0;
//system("clear");
system("clear");
printf("请输入要查询的人员姓名:");
//fgets(name1,20,stdin);
scanf("%s",name1);
if(strlen(name1)==19&&name1[18]!='\n')
{
scanf("%*[^\n]");
scanf("%*c");
}
//if(name[strlen(name)-1]=='\n')
//name[strlen(name)-1]='\0';
FILE *fp=fopen("a.bin","rb");
if(fp)
{
while(fread(&id,sizeof(int),1,fp))
{
fread(name,sizeof(char),20,fp);
fread(&salary,sizeof(float),1,fp);
if(indexof(name,name1))
{
system("clear");
printf("存在该用户,查询成功!\n");
printf("您查询的人员的信息如下\n");
printf("******************************************\n");
printf("* id\t\tname\t\tsalary *\n");
printf("******************************************\n");
printf("* %d\t\t%s\t\t%g *\n",id,name,salary);
printf("******************************************\n");
//printf("\tid\t姓名\t工资\n");
//printf("\t%d\t%s\t%g\n\n",id,name,salary);
flag=1;
}
}
if(flag==0)
{
printf("姓名不存在,查询失败!\n");
}
fclose(fp);
fp=NULL;
}
}
//修改信息
void update()
{
char name[20];
int id=0,id1=0;
float salary=0;
//system("clear");
system("clear");
printf("请输入要修改人员的id:");
scanf("%d",&id1);
FILE *fp=fopen("a.bin","rb+");
if(!fp)
{
printf("Cannot open the file!");
return;
}
else
{
while(fread(&id,sizeof(int),1,fp))
{
if(id==id1)
{
fread(name,sizeof(char),20,fp);
fread(&salary,sizeof(float),1,fp);
printf("您所需要修改的人员信息如下\n");
//
printf("******************************************\n");
printf("* id\t\tname\t\tsalary *\n");
printf("******************************************\n");
printf("* %d\t\t%s\t\t%g *\n",id,name,salary);
printf("******************************************\n");
//printf("\tid\t姓名\t工资\n");
//printf("\t%d\t%s\t%g\n",id,name,salary);
printf("请输入修改后的姓名:");
scanf("%s",name);
printf("请输入修改后的工资:");
scanf("%f",&salary);
fseek(fp,-24,SEEK_CUR);
fwrite(name,sizeof(char),20,fp);
fwrite(&salary,sizeof(float),1,fp);
break;
}
}
fclose(fp);
fp=NULL;
}
}
//删除信息
void del()
{
int id1=0,id=0;
char name[20];
float salary=0;
FILE *fp=fopen("a.bin","rb");//以只读的方式打开
FILE *fp1=fopen("b.bin","w+b");//作为临时文件,以读写的方式打开
if(!fp||!fp1)
{
printf("Cannot open the file!\n");
return;
}
else
{
while(fread(&id,sizeof(int),1,fp))//将源文件复制一份给临时文件
{
fwrite(&id,sizeof(int),1,fp1);
fread(name,sizeof(char),20,fp);
fwrite(name,sizeof(char),20,fp1);
fread(&salary,sizeof(float),1,fp);
fwrite(&salary,sizeof(float),1,fp1);
}
fclose(fp);
fp=NULL;
FILE *fp2=fopen("a.bin","wb");//再将源文件以只写的方式打开
if(!fp2)
{
printf("Cannot open the file!\n");
return;
}
else
{
//system("clear");
system("clear");
printf("请输入要删除的人员的id:");
scanf("%d",&id1);
rewind(fp1);//将临时文件的文件指针移到文件头
//降临时文件中除了要删除的人员信息之外的其余的信息重新写回源文件
while(fread(&id,sizeof(int),1,fp1))
{
if(id==id1)
{
fseek(fp1,24,SEEK_CUR);
continue;
}
fwrite(&id,sizeof(int),1,fp2);
fread(name,sizeof(char),20,fp1);
fwrite(name,sizeof(char),20,fp2);
fread(&salary,sizeof(float),1,fp1);
fwrite(&salary,sizeof(float),1,fp2);
}
}
fclose(fp1);
fp1=NULL;
fclose(fp2);
fp2=NULL;
}
}
void sort()
{
int ids[100],id1,i=0,j,k,n;
char name[100][20],name1[20];
float sal[100],sal1;
FILE *fp=fopen("a.bin","rb");
if(!fp)
{
printf("Cannot open the file!\n");
return;
}
while(fread(&id1,sizeof(int),1,fp))//将信息先存放在数组中
{
fread(name1,sizeof(char),20,fp);
fread(&sal1,sizeof(float),1,fp);
ids[i]=id1;
strcpy(name[i],name1);
sal[i]=sal1;
i++;
}
for(j=0;j<i-1;j++)//将信息按id从小到大排序
{
for(k=0;k<i-j-1;k++)
{
if(ids[k]>ids[k+1])
{
id1=ids[k];
ids[k]=ids[k+1];
ids[k+1]=id1;
strcpy(name1,name[k]);
strcpy(name[k],name[k+1]);
strcpy(name[k+1],name1);
sal1=sal[k];
sal[k]=sal[k+1];
sal[k+1]=sal1;
}
}
}
fclose(fp);
fp=NULL;
//排好序后再讲数组中的数据信息写回到文件中
//rewind(fp);
FILE *fp1=fopen("a.bin","wb");
if(!fp1)
{
printf("Cannot open the file!\n");
return;
}
for(n=0;n<i;n++)
{
fwrite(&ids[n],sizeof(int),1,fp1);
fwrite(name[n],sizeof(char),20,fp1);
fwrite(&sal[n],sizeof(float),1,fp1);
}
fclose(fp1);
fp1=NULL;
}
void list()
{
sort();
int id=0,num=0;
char name[20];
float salary=0;
FILE *fp=fopen("a.bin","rb");
if(!fp)
{
printf("Cannot open the file!\n");
return;
}
else
{
system("clear");
printf("******************************************\n");
printf("* id\t\tname\t\tsalary *\n");
printf("******************************************\n");
while(fread(&id,sizeof(int),1,fp))
{
num++;
fread(name,sizeof(char),20,fp);
fread(&salary,sizeof(float),1,fp);
printf("* %d\t\t%s\t\t%g *\n",id,name,salary);
}
printf("******************************************\n");
printf("共显示%d个人员信息\n",num);
}
fclose(fp);
fp=NULL;
}
void over()
{
system("clear");
printf("******************\n");
printf("* GOOD BYE *\n");
printf("******************\n");
}
int main()
{
int i;
char ch;
while(1)
{
show();
printf("请选择:");
scanf("%d",&i);
switch(i)
{
case 1:
printf("共录入了%d个用户的信息\n",save());
getchar();
system("CLS");
break;
case 2:
id_query();
break;
case 3:
name_query();
break;
case 4:
m_name_search();
break;
case 5:
update();
break;
case 6:
del();
break;
case 7:
//printf("hello\n");
list();
break;
case 0:
over();
return 0;
}
if(i!=1)
{
scanf("%*[^\n]");
scanf("%*c");
printf("(按Enter键返回)\n");
getchar();
system("clear");
}
}
}