帮我把添加和删除员工信息后的数组数据保存到原文件,在原有的基础上改

#include<setjmp.h>
#include
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
jmp_buf fanhuizhi; //定义一个跳跃用参数
struct yuangong //定义员工结构体
{
int gonghao; //工号
char name[10]; //名字
int gongzi; //基本工资
int butie; //补贴
int jiangjin; //奖金
int shuidian; //水电费
int fangzu; //房租
}xinxi[20];

void fanhuicaidan() //定义一个返回菜单的选择函数
{
int x;
printf("是否返回主菜单?是请按1,退出程序请按0并回车键确定:");
scanf("%d", &x);
switch (x)
{
case 1:longjmp(fanhuizhi, 0); break; //如果选1则跳跃回setjmp处
case 0:exit(0); break;
}
}

void search(yuangong xinxi[]) //(1)查找员工信息函数
{
int i,j=0,x;
int h;
begin1: //程序返回开始处
printf("请输入想要查询员工的工号:");
scanf("%d",&h);
for (i = 0; i < 10; i++) //判断是否有此工号
{
if (xinxi[i].gonghao==h) //如果找到文件中有此工号,输出信息
{
printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────┐\n");
printf("\t\t\t│工号 姓名 基本工资 补贴 奖金 水电 房租 │\n");
printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────┤\n");
printf("\t\t\t│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\n",
xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu);
printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────┘\n");
j=1;
}
}

if(j==0)
{
    printf("此员工不存在\n");                                   
    goto begin1;                                                //若无此工号返回重新输入
}
fanhuicaidan();
}    

void add(yuangong xinxi[],int realmoney[]) //(2)添加员工信息函数
{
FILE *fp;
fp = fopen("课程设计员工信息.txt", "r");
int x,i,j,k,m;
struct yuangong xinren; //定义新员工结构体
begin2: //程序返回开始处
printf("请以下次序输入新员工的信息\n");
printf("工号 姓名 基本工资 补贴 奖金 水电 房租\n");
scanf("%d%s%d%d%d%d%d",&xinren.gonghao, xinren.name, &xinren.gongzi,&xinren.butie,&xinren.jiangjin,&xinren.shuidian,&xinren.fangzu);

for (i = 0; i < 10; i++)                                        //判断输入的新员工工号是否已经存在
{
    if (xinren.gonghao == xinxi[i].gonghao)
    {
        printf("当前工号已存在,请检查后重新输入\n");
        goto begin2;                                            //如果工号已经存在,返回到开始处重新输入   
    }
}

if (xinren.gonghao < xinxi[0].gonghao)                          //小于第一个员工工号时插入到第一个位置
{
    for (i = 10; i > 0; i--)
    {
        xinxi[i] = xinxi[i - 1];
    }
    xinxi[0] = xinren;
}

if (xinren.gonghao > xinxi[9].gonghao)                          //大于最后一个员工工号时插入到最后位置
{
    xinxi[10] = xinren;
}

for (j = 0; j < 10; j++)                                        //找到新员工工号位于哪两个之间
                {
                    if (xinren.gonghao > xinxi[j].gonghao && xinren.gonghao < xinxi[j + 1].gonghao)
                    {
                        for (k = 10; k > j; k--)
                            xinxi[k] = xinxi[k - 1];
                        xinxi[j + 1] = xinren;
                    }
                }    



printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────┐\n");                                 
printf("\t\t\t│工号     姓名                  基本工资        补贴       奖金     水电     房租    │\n");
printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────┤\n");
for (i = 0; i < 11; i++)
{
    printf("\t\t\t│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\n",xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu);
}
printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────┘\n");

fanhuicaidan();
}

void save ()
{
FILE * fp;
int i;
if((fp=fopen("课程设计员工信息.txt", "wb") )==NULL)
{printf("Can not open this file\n");
exit (1) ;
}
for(i=0;i<20;i++)

if(fwrite(&xinxi[i],sizeof (struct yuangong),1,fp) !=1)

printf("file write error\n");

fclose(fp);
}

void del(yuangong xinxi[]) //(3)删除员工信息函数
{
int x,i,j,k,m=0;
char name[20];
begin3: //程序返回开始处
printf("请输入要删除员工的名字:");
scanf("%s", name);
for (i = 0; i < 10; i++) //判断文件中有没有输入的名字并改变m的值
{
if (strcmp(name, xinxi[i].name) == 0)
m = 1;
}

if (m == 0)                                                              //通过m的值进行操作
{
    printf("未找到此员工,请核实后重新输入\n");
    goto begin3;                                                         //未找到员工,返回重新输入
}
else
{
    for(j=0;j<10;j++)
        if (strcmp(name, xinxi[j].name) == 0)
        {
            for (k = j; k < 9; k++)
                xinxi[k] = xinxi[k + 1];
        }
 }

printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────┐\n");
printf("\t\t\t│工号     姓名                  基本工资        补贴       奖金     水电     房租    │\n");
printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────┤\n");
for (i = 0; i < 9; i++)
{
    printf("\t\t\t│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\n", xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu);
}
printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────┘\n");
}

void real(yuangong xinxi[],int realmoney[]) //(4)计算实发工资函数
{
int i,x;
printf("\n\t\t\t┌────────────────────────────────┐\n");
printf("\t\t\t│工号 姓名 实发工资 │\n");
printf("\t\t\t├────────────────────────────────┤\n");
for(i=0;i<10;i++)
printf("\t\t\t│%-9d%-12s%-11d│\n", xinxi[i].gonghao, xinxi[i].name,realmoney[i]);
printf("\t\t\t└────────────────────────────────┘\n");
fanhuicaidan();
}

void rank(yuangong xinxi[], int realmoney[]) //(5)排序函数
{
int i,x, j, k, t;
struct yuangong change; //定义一个用于交换的结构体
for (i = 0; i < 9; i++) //通过冒泡法依据实发工资排序
{
for (j = 0; j < 9 - i; j++)
if (realmoney[j] > realmoney[j + 1])
{
change = xinxi[j];
xinxi[j] = xinxi[j + 1];
xinxi[j + 1] = change;
t = realmoney[j];
realmoney[j] = realmoney[j + 1];
realmoney[j + 1] = t;
}
}

    printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────────────────────┐\n");
    printf("\t\t\t│工号     姓名        基本工资        补贴       奖金     水电     房租        实发工资  实发工资排名│\n");
    printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────────────────────┤\n");
    for (i = 0; i < 10; i++)
        printf("\t\t\t│%-8d%-14s%-16d%-10d%-10d%-8d%-14d%-14d%-6d│\n",
            xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu, realmoney[i], i + 1);
    printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────────────────────┘\n");
    fanhuicaidan();
    

}

void main()
{
int a,i,s=0;
int realmoney[10]; //定义一个计算实发工资的数组
FILE *fp;
system("color 30"); //更换背景为湖蓝色,字体为黑色
fp = fopen("课程设计员工信息.txt", "r");
printf("\t\t ╭ ═══════■□■□═══════ ╮\n"); //菜单界面
printf("\t\t │ 员工信息管理系统 │\n");
printf("\t\t ╰ ═══════■□■□═══════ ╯\n");
printf("\t\t ┌─────────────—──────────—-┐\n");
printf("\t\t │ 1. 查询信息 2. 添加员工 │\n");
printf("\t\t │ │\n");
printf("\t\t │ 3. 删除信息 4. 实发工资 │\n");
printf("\t\t │ │\n");
printf("\t\t │ 5. 工资排名 0. 退出程序 │\n");
printf("\t\t │ │\n");
printf("\t\t └─────────────—──────────—-┘\n");
if (setjmp(fanhuizhi)) //longjum跳到此处
{fprintf(fp, "%d%s%d%d%d%d%d", &xinxi[i].gonghao, xinxi[i].name, &xinxi[i].gongzi, &xinxi[i].butie, &xinxi[i].jiangjin, &xinxi[i].shuidian, &xinxi[i].fangzu);
fclose(fp);
goto begin;
}
{
for (i = 0; i < 10; i++)
fscanf(fp, "%d%s%d%d%d%d%d", &xinxi[i].gonghao, xinxi[i].name, &xinxi[i].gongzi, &xinxi[i].butie, &xinxi[i].jiangjin, &xinxi[i].shuidian, &xinxi[i].fangzu);
for (i = 0; i < 10; i++)
realmoney[i] = xinxi[i].gongzi + xinxi[i].jiangjin + xinxi[i].butie - xinxi[i].shuidian - xinxi[i].fangzu; //计算实发工资
begin:
printf("\t\t请您选择(0-5):"); //程序返回开始处
scanf("%d", &a); //序号选择
if (a >= 0 && a <= 5) //判断序号是否合法
{
switch (a)
{
case 0:exit(0); break;
case 1:search(xinxi);system("pause"); break;
case 2:add(xinxi,realmoney); system("pause"); break;
case 3:del(xinxi);system("pause"); break;
case 4:real(xinxi, realmoney); system("pause"); break;
case 5:rank(xinxi, realmoney); system("pause"); break;
}
}
else
{
printf("\t\t请输入正确的功能序号\n");
goto begin; //序号错误程序跳回输出序号处
}
}
system("pause");
}

代码有点乱,而且用了goto语句,代码修改内容如下:
1.增加了一个全局变量,用于保存实际员工数量,看你代码中好像初始时有10个员工信息,所以我把初始值设置为10了;
然后在add和del函数中,对实际员工数量进行了加一和减一操作。
2.修改了save函数
3.在main函数中,在退出前(case 0)调用save函数保存文件。
4.读取文件的地方,加了几个空格(不影响原来的功能)
具体代码如下:

#include<setjmp.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
jmp_buf fanhuizhi; //定义一个跳跃用参数
struct yuangong //定义员工结构体
{
    int gonghao; //工号
    char name[10]; //名字
    int gongzi; //基本工资
    int butie; //补贴
    int jiangjin; //奖金
    int shuidian; //水电费
    int fangzu; //房租
}xinxi[20];

int g_ralnmb = 0;//记录数组中实际的员工数量


void fanhuicaidan() //定义一个返回菜单的选择函数
{
    int x;
    printf("是否返回主菜单?是请按1,退出程序请按0并回车键确定:");
    scanf("%d", &x);
    switch (x)
    {
    case 1:longjmp(fanhuizhi, 0); break; //如果选1则跳跃回setjmp处
    case 0:exit(0); break;
    }
}

void search(yuangong xinxi[]) //(1)查找员工信息函数
{
    int i,j=0,x;
    int h;
begin1: //程序返回开始处
    printf("请输入想要查询员工的工号:");
    scanf("%d",&h);
    for (i = 0; i < 10; i++) //判断是否有此工号
    {
        if (xinxi[i].gonghao==h) //如果找到文件中有此工号,输出信息
        {
            printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────┐\n");
            printf("\t\t\t│工号 姓名 基本工资 补贴 奖金 水电 房租 │\n");
            printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────┤\n");
            printf("\t\t\t│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\n",
                xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu);
            printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────┘\n");
            j=1;
        }
    }

    if(j==0)
    {
        printf("此员工不存在\n");                                   
        goto begin1;                                                //若无此工号返回重新输入
    }
    fanhuicaidan();
}    
void add(yuangong xinxi[],int realmoney[]) //(2)添加员工信息函数
{
    FILE *fp;
    fp = fopen("课程设计员工信息.txt", "r");
    int x,i,j,k,m;
    struct yuangong xinren; //定义新员工结构体
begin2: //程序返回开始处
    printf("请以下次序输入新员工的信息\n");
    printf("工号 姓名 基本工资 补贴 奖金 水电 房租\n");
    scanf("%d%s%d%d%d%d%d",&xinren.gonghao, xinren.name, &xinren.gongzi,&xinren.butie,&xinren.jiangjin,&xinren.shuidian,&xinren.fangzu);

    for (i = 0; i < 10; i++)                                        //判断输入的新员工工号是否已经存在
    {
        if (xinren.gonghao == xinxi[i].gonghao)
        {
            printf("当前工号已存在,请检查后重新输入\n");
            goto begin2;                                            //如果工号已经存在,返回到开始处重新输入   
        }
    }

    if (xinren.gonghao < xinxi[0].gonghao)                          //小于第一个员工工号时插入到第一个位置
    {
        for (i = 10; i > 0; i--)
        {
            xinxi[i] = xinxi[i - 1];
        }
        xinxi[0] = xinren;
    }

    if (xinren.gonghao > xinxi[9].gonghao)                          //大于最后一个员工工号时插入到最后位置
    {
        xinxi[10] = xinren;
    }

    for (j = 0; j < 10; j++)                                        //找到新员工工号位于哪两个之间
    {
        if (xinren.gonghao > xinxi[j].gonghao && xinren.gonghao < xinxi[j + 1].gonghao)
        {
            for (k = 10; k > j; k--)
                xinxi[k] = xinxi[k - 1];
            xinxi[j + 1] = xinren;
        }
    }    
    
    g_ralnmb++; //员工数+1


    printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────┐\n");                                 
    printf("\t\t\t│工号     姓名                  基本工资        补贴       奖金     水电     房租    │\n");
    printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────┤\n");
    for (i = 0; i < 11; i++)
    {
        printf("\t\t\t│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\n",xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu);
    }
    printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────┘\n");
    fanhuicaidan();
}

void save ()
{
    FILE * fp;
    int i;
    if((fp=fopen("课程设计员工信息.txt", "wb") )==NULL)
    {
        printf("Can not open this file\n");
        exit (1) ;
    }

    int gonghao; //工号
    char name[10]; //名字
    int gongzi; //基本工资
    int butie; //补贴
    int jiangjin; //奖金
    int shuidian; //水电费
    int fangzu; //房租


    for (i=0;i<g_ralnmb;i++)
    {
        fprintf(fp,"%d %s %d %d %d %d %d\n",xinxi[i].gonghao,xinxi[i].name,xinxi[i].gongzi,xinxi[i].butie,xinxi[i].jiangjin,xinxi[i].shuidian,xinxi[i].fangzu);
    }


    /*
    for(i=0;i<20;i++)

        if(fwrite(&xinxi[i],sizeof (struct yuangong),1,fp) !=1)

            printf("file write error\n");
            */

    fclose(fp);
}

void del(yuangong xinxi[]) //(3)删除员工信息函数
{
    int x,i,j,k,m=0;
    char name[20];
begin3: //程序返回开始处
    printf("请输入要删除员工的名字:");
    scanf("%s", name);
    for (i = 0; i < 10; i++) //判断文件中有没有输入的名字并改变m的值
    {
        if (strcmp(name, xinxi[i].name) == 0)
            m = 1;
    }

    if (m == 0)                                                              //通过m的值进行操作
    {
        printf("未找到此员工,请核实后重新输入\n");
        goto begin3;                                                         //未找到员工,返回重新输入
    }
    else
    {
        for(j=0;j<10;j++)
            if (strcmp(name, xinxi[j].name) == 0)
            {
                for (k = j; k < 9; k++)
                    xinxi[k] = xinxi[k + 1];
            }
    }

    g_ralnmb--; //员工数量减一
    printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────┐\n");
    printf("\t\t\t│工号     姓名                  基本工资        补贴       奖金     水电     房租    │\n");
    printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────┤\n");
    for (i = 0; i < 9; i++)
    {
        printf("\t\t\t│%-8d%-24s%-16d%-10d%-10d%-8d%-8d│\n", xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu);
    }
    printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────┘\n");
}
void real(yuangong xinxi[],int realmoney[]) //(4)计算实发工资函数
{
    int i,x;
    printf("\n\t\t\t┌────────────────────────────────┐\n");
    printf("\t\t\t│工号 姓名 实发工资 │\n");
    printf("\t\t\t├────────────────────────────────┤\n");
    for(i=0;i<10;i++)
        printf("\t\t\t│%-9d%-12s%-11d│\n", xinxi[i].gonghao, xinxi[i].name,realmoney[i]);
    printf("\t\t\t└────────────────────────────────┘\n");
    fanhuicaidan();
}

void rank(yuangong xinxi[], int realmoney[]) //(5)排序函数
{
    int i,x, j, k, t;
    struct yuangong change; //定义一个用于交换的结构体
    for (i = 0; i < 9; i++) //通过冒泡法依据实发工资排序
    {
        for (j = 0; j < 9 - i; j++)
            if (realmoney[j] > realmoney[j + 1])
            {
                change = xinxi[j];
                xinxi[j] = xinxi[j + 1];
                xinxi[j + 1] = change;
                t = realmoney[j];
                realmoney[j] = realmoney[j + 1];
                realmoney[j + 1] = t;
            }
    }

    printf("\n\t\t\t┌────────────────────────────────────────────────────────────────────────────────────────────────────┐\n");
    printf("\t\t\t│工号     姓名        基本工资        补贴       奖金     水电     房租        实发工资  实发工资排名│\n");
    printf("\t\t\t├────────────────────────────────────────────────────────────────────────────────────────────────────┤\n");
    for (i = 0; i < 10; i++)
        printf("\t\t\t│%-8d%-14s%-16d%-10d%-10d%-8d%-14d%-14d%-6d│\n",
        xinxi[i].gonghao, xinxi[i].name, xinxi[i].gongzi, xinxi[i].butie, xinxi[i].jiangjin, xinxi[i].shuidian, xinxi[i].fangzu, realmoney[i], i + 1);
    printf("\t\t\t└────────────────────────────────────────────────────────────────────────────────────────────────────┘\n");
    fanhuicaidan();

}

void main()
{
    int a,i,s=0;
    int realmoney[10]; //定义一个计算实发工资的数组
    FILE *fp;
    system("color 30"); //更换背景为湖蓝色,字体为黑色
    fp = fopen("课程设计员工信息.txt", "r");
    printf("\t\t ╭ ═══════■□■□═══════ ╮\n"); //菜单界面
    printf("\t\t │ 员工信息管理系统 │\n");
    printf("\t\t ╰ ═══════■□■□═══════ ╯\n");
    printf("\t\t ┌─────────────—──────────—-┐\n");
    printf("\t\t │ 1. 查询信息 2. 添加员工 │\n");
    printf("\t\t │ │\n");
    printf("\t\t │ 3. 删除信息 4. 实发工资 │\n");
    printf("\t\t │ │\n");
    printf("\t\t │ 5. 工资排名 0. 退出程序 │\n");
    printf("\t\t │ │\n");
    printf("\t\t └─────────────—──────────—-┘\n");
    if (setjmp(fanhuizhi)) //longjum跳到此处
    {
        fprintf(fp, "%d%s%d%d%d%d%d", &xinxi[i].gonghao, xinxi[i].name, &xinxi[i].gongzi, &xinxi[i].butie, &xinxi[i].jiangjin, &xinxi[i].shuidian, &xinxi[i].fangzu);
        fclose(fp);
        goto begin;
    }
    {
        for (i = 0; i < 10; i++)
            fscanf(fp, "%d %s %d %d% d% d% %d\n", &xinxi[i].gonghao, xinxi[i].name, &xinxi[i].gongzi, &xinxi[i].butie, &xinxi[i].jiangjin, &xinxi[i].shuidian, &xinxi[i].fangzu);
        for (i = 0; i < 10; i++)
            realmoney[i] = xinxi[i].gongzi + xinxi[i].jiangjin + xinxi[i].butie - xinxi[i].shuidian - xinxi[i].fangzu; //计算实发工资
begin:
        printf("\t\t请您选择(0-5):"); //程序返回开始处
        scanf("%d", &a); //序号选择
        if (a >= 0 && a <= 5) //判断序号是否合法
        {
            switch (a)
            {
            case 0:save();exit(0); break;  //推出前保存
            case 1:search(xinxi);system("pause"); break;
            case 2:add(xinxi,realmoney); system("pause"); break;
            case 3:del(xinxi);system("pause"); break;
            case 4:real(xinxi, realmoney); system("pause"); break;
            case 5:rank(xinxi, realmoney); system("pause"); break;
            }
        }
        else
        {
            printf("\t\t请输入正确的功能序号\n");
            goto begin; //序号错误程序跳回输出序号处
        }
    }
    system("pause");
}