用链表写的职工工资管理系统在读取文件内容时出错

#include
#include
#include
#include
#define LEN sizeof(struct worker)
#define N 3
int n;
typedef struct worker //定义结构体
{
long num;
char name[20];
char bm[20];
int gwgz;
int gwjt;
int bfgz;
int ylbx;
int sds;
int sdf;
int yfgz;
int sfgz;
struct worker*next;

}YZY;
int*tzz()//创建头指针
{
YZY*head;
head = (YZY*)malloc(LEN);
return (head);
}
void create(YZY*head)//创建链表函数
{
YZY*p1;
YZY*p2;
p2 = (YZY*)malloc(LEN);
p1 = head;
p2 = head;
for(n = 1; n < N; n++)
{
p1 = (YZY*)malloc(LEN);
p2->next = p1;
p2 = p1;
}
p2->next = NULL;
}
void save(YZY*head) //保存函数
{
FILE*fp;
YZY*p1;
p1 = head;
if ((fp = fopen("stu.txt", "wb")) == NULL)
{
printf("can not open file\n");

}

do
{
    fwrite(p1, sizeof(LEN), 1, fp);
    p1 = p1->next;

}while (p1 != NULL);
fclose(fp);
return;

}
void add(YZY*head) //添加原始信息函数
{
YZY*p1;
p1 = head;
n = 1;
do
{
printf("请输入第%d个职工的初始信息:\n", n);
printf("请输入员工的职工号:\n");
scanf("%d", &p1->num);
printf("请输入员工的姓名:\n");
scanf("%s", p1->name);
printf("请输入员工的所属部门\n");
scanf("%s", p1->bm);
printf("请输入员工的岗位工资\n");
scanf("%d", &p1->gwgz);
printf("请输入员工的岗位津贴\n");
scanf("%d", &p1->gwjt);
printf("请输入员工的补发工资\n");
scanf("%d", &p1->bfgz);
printf("请输入员工的医疗保险\n");
scanf("%d", &p1->ylbx);
printf("请输入员工的水电费\n");
scanf("%d", &p1->sdf);
p1->yfgz = p1->gwgz + p1->gwjt + p1->bfgz + p1->ylbx;
p1 = p1->next;
system("cls");
n++;
} while (p1 != NULL);
save(head);
}

void load(YZY*head)//读取函数
{

FILE*fp;
YZY*p;
p = head;
if ((fp = fopen("stu.txt", "rb")) == NULL)
{
    printf("error\n");
    exit(0);
}
do
{
    fread(p, sizeof(LEN),1, fp);
    printf("%d", p->num);
    p = p->next;
} while (p != NULL);
fclose(fp);
return;

}
void print(YZY*head)//输出所有员工信息
{
YZY*p;
printf("全体职工信息如下:\n");
/*load(head);*/
p = head;
do
{
printf("员工号为:%d\n", p->num);
printf("姓名:%s\n", p->name);
printf("所属部门:%s\n", p->bm);
printf("岗位工资为:%d\n", p->gwgz);
printf("岗位津贴为:%d\n", p->gwjt);
printf("医疗保险为:%d\n", p->ylbx);
printf("补发工资为:%d\n", p->bfgz);
printf("所得税为:%d\n", p->sds);
printf("水电费为:%d\n", p->sdf);
printf("应发工资为%d\n", p->yfgz);
printf("实发工资为:%d\n", p->sfgz);
p = p->next;
} while (p != NULL);

}
void del(YZY*head) //删除函数
{
YZY*p;
YZY*q;
q = (YZY*)malloc(LEN);
p = head;
int ch;
int a;
printf("请输入您要删除的职工的职工号\n");
scanf("%d", &ch);
printf("请确认是否删除员工号为%d的员工\n", ch);
printf("1(确认删除) 2(退出主菜单)");
scanf("%d", &a);
if (a == 2)
{
menu();
}
if (a == 1)
{
if (head->num == ch)
{
head = p->next;
free(head);
printf("删除成功按任意键返回 主菜单\n");
system("pause");
menu();

    }
    for (p = p->next; p->num != ch; p = p->next)
    {
        p = q;
        if (p->num = ch)
        {
            q->next = p->next;
            free(p);
            return;
            printf("删除成功按任意键返回主菜单\n");
            system("pause");
            menu();

        }
    }
    if (p->num != ch)
    {
        printf("对不起查无此人 将返回主菜单\n");
        menu();
    }
}
save(head);

}

void insert(YZY*head) //增添函数
{
YZY*p;
YZY*q;
q = head;
p = (YZY*)malloc(LEN);
printf("请输入您要增加的员工的员工号:\n");
scanf("%d", &p->num);
for (; q != NULL; q = q->next)
{
if (q->num == p->num)

        printf("对不起 该工号已经被占用 请重新输入\n");



    else
    {
        printf("输入成功 请完成其它信息的输入\n");
        printf("请输入员工的姓名:\n");
        scanf("%s", p->name);
        printf("请输入员工的所属部门\n");
        scanf("%s", p->bm);
        printf("请输入员工的岗位工资\n");
        scanf("%d", &p->gwgz);
        printf("请输入员工的岗位津贴\n");
        scanf("%d", &p->gwjt);
        printf("请输入员工的补发工资\n");
        scanf("%d", &p->bfgz);
        printf("请输入员工的医疗保险\n");
        scanf("%d", &p->ylbx);
        printf("请输入员工的水电费\n");
        scanf("%d", &p->sdf);
        p->yfgz = p->gwgz + p->gwjt + p->bfgz + p->bfgz + p->ylbx;
        p->next = head->next;
        head->next = p;
        save(head);
    }
    break;
}

}
void search(YZY*head)
{
int ch;
int i;
YZY m;
YZY*p;
p = head;
printf("请选择您要查询的方式: 1、按职工号查找 2、按职工姓名查找\n");
scanf("%d", &ch);
if (ch == 1)
{
printf("请输入您要查找的职工号\n");
scanf("%d", &i);
if (p->num == i)
{
printf("该员工的信息如下\n");
printf("该员工的员工号为:%d\n", p->num);
printf("该员工的姓名为:%s\n", p->name);
printf("该员工所属的部门是:%s\n", p->bm);
printf("该员工的岗位工资为:%d\n", p->gwgz);
printf("该员工的岗位津贴为:%d\n", p->gwjt);
printf("该员工的补发工资为:%d\n", p->bfgz);
printf("该员工的医疗保险为:%d\n", p->ylbx);
printf("该员工的所得税为:%d\n", p->sds);
printf("该员工的水电费为:%d\n", p->sdf);
printf("该员工的应发工资为:%d\n", p->yfgz);
printf("该员工的实发工资为:%d\n", p->sfgz);
}

    for (p = p->next; p != NULL; p = p->next)
    {
        if (p->num == i)

        {

            printf("该员工的信息如下\n");
            printf("该员工的员工号为:%d\n", p->num);
            printf("该员工的姓名为:%s\n", p->name);
            printf("该员工所属的部门是:%s\n", p->bm);
            printf("该员工的岗位工资为:%d\n", p->gwgz);
            printf("该员工的岗位津贴为:%d\n", p->gwjt);
            printf("该员工的补发工资为:%d\n", p->bfgz);
            printf("该员工的医疗保险为:%d\n", p->ylbx);
            printf("该员工的所得税为:%d\n", p->sds);
            printf("该员工的水电费为:%d\n", p->sdf);
            printf("该员工的应发工资为:%d\n", p->yfgz);
            printf("该员工的实发工资为:%d\n", p->sfgz);
            goto loop;

        }
    }

            if (p == NULL)
            {
                printf("输入的职工号错误\n");

            }

        loop:i = 0;
}


if (ch == 2)
{
    printf("请输入要查找的的员工姓名\n");
    scanf("%s", m.name);
    if (strcmp(p->name, m.name) == 0)
    {
        printf("该员工的信息如下\n");
        printf("该员工的员工号为:%d\n", p->num);
        printf("该员工的姓名为:%s\n", p->name);
        printf("该员工所属的部门是:%s\n", p->bm);
        printf("该员工的岗位工资为:%d\n", p->gwgz);
        printf("该员工的岗位津贴为:%d\n", p->gwjt);
        printf("该员工的补发工资为:%d\n", p->bfgz);
        printf("该员工的医疗保险为:%d\n", p->ylbx);
        printf("该员工的所得税为:%d\n", p->sds);
        printf("该员工的水电费为:%d\n", p->sdf);
        printf("该员工的应发工资为:%d\n", p->yfgz);
        printf("该员工的实发工资为:%d\n", p->sfgz);
    }

    menu();
}
if (p = NULL)
{
    printf("你输入的的名字错误\n");




}
menu();

}
void modify(YZY*head)
{

YZY*p1;
int ch;
printf("请输入您要改的员工的工号:\n");
scanf("%d", &ch);
p1 = head;
for (; p1->num != ch; p1 = p1->next)
{
    if (p1->num == ch)
    {
        printf("请输入新员工的初始信息:\n");
        printf("请输入新的职工号:\n");
        scanf("%d", &p1->num);
        printf("请输入新的姓名:\n");
        scanf("%s", p1->name);
        printf("请输入新的所属部门\n");
        scanf("%s", p1->bm);
        printf("请输入新的岗位工资\n");
        scanf("%d", &p1->gwgz);
        printf("请输入新的岗位津贴\n");
        scanf("%d", &p1->gwjt);
        printf("请输入新的补发工资\n");
        scanf("%d", &p1->bfgz);
        printf("请输入新的医疗保险\n");
        scanf("%d", &p1->ylbx);
        printf("请输入新的水电费\n");
        scanf("%d", &p1->sdf);
        p1->yfgz = p1->gwgz + p1->gwjt + p1->bfgz + p1->bfgz + p1->ylbx;
        /*count(p1);*/
        save(head);

    }
    if (p1 == NULL)
    {

        printf("对不起查无此人 将返回主菜单\n");


    }

}

}

int menu()
{
printf(" ****************欢迎进入南天职工工资管理系统******************** \n");
printf(" 1.录入员工基本信息 2.输出所有员工初始数据 \n");
printf(" 3.查询员工工资明细 4.增加员工工资信息 \n");
printf(" 5.修改员工工资信息 6.删除员工工资信息 \n");
printf(" 7.读出原始数据 制作人:姚智瀛");
printf(" (请选择输入1-6选择您的操作 ) \n");
return 0;
}

int main()
{
int m;
m = 0;
int button;
YZY*head;
head = tzz();
create(head);
menu();
while (m != 1)
{

    printf("请根据提示选择您要使用的功能\n");
    scanf("%d", &button);
    switch (button)
    {   
    case 1: add(head);  break;
    case 2:print(head);   break;
    case 3:search(head);  break;
    case 4:insert(head);     break;
    case 5:modify(head);  break;
    case 6:del(head);     break;
    case 7:load(head);    break;
    case 8:
    case 9:printf("输入错误 请依照提示重新输入\n"); break;
    default:  break;

    }

    menu();


}

}

请把错误提示也一起粘贴出来

求各位大佬指点。 我知道这样每次重新运行后 地址都是重新分配的。 但是为啥却又能读出员工职工号来 其他的都是乱码。。。。 该怎么改 新手 还望大佬们讲详细点

图片说明

推荐你用list或者vector 或者map容器做数据的多层储存,你只需要做一个成员的完整信息记录加到容器里储存就行了,我空间有list 和map的实现代码可以做参考。

文件读写时,读写长度出错了,既然已经定义 #define LEN sizeof(struct worker) 了,读写时直接用LEN就可以了,干嘛使用sizeof(LEN) 呢????

void save(YZY*head) //保存函数
{
    FILE*fp;
    YZY*p1;
    p1 = head;
    if ((fp = fopen("stu.txt", "wb")) == NULL)
    {
        printf("can not open file\n");

    }
    do
    {
        fwrite(p1, LEN, 1, fp); //这里要用LEN
        p1 = p1->next;

    }while (p1 != NULL);
    fclose(fp);
    return;
}
void load(YZY*head)//读取函数
{
    FILE*fp;
    YZY*p;
    p = head;
    if ((fp = fopen("stu.txt", "rb")) == NULL)
    {
        printf("error\n");
        exit(0);
    }
    do
    {
        fread(p, LEN,1, fp);  //这里也要有LEN!
        printf("%d", p->num);
        p = p->next;
    } while (p != NULL);
    fclose(fp);
    return;
}

重新运行是读取出来是乱码,那多半都是写入的问题咯

你这个程序是没有问题的,你说的乱码问题是初始化的里的内存随机乱码产生的,你需要先添加员工信息。我验证是对的
图片说明

同学你解决这个问题了吗,我也出现这个问题!明明和同学代码一样,可是我的就是乱码

#include "record.h"

//文件存储操作函数
void save(const BOOK *top)
{
const BOOK *p;
FILE *fp;

if(count==0)
{

    printf("没有记录可存!");
    return;
}

if((fp=fopen("BOOK.txt","wb"))==NULL)
{
    printf("不能打开文件!\n");
    exit(1);
}

printf("\n存文件\n");
p=top;

while(p)
{
    fwrite(p,LEN,1,fp);
    p=p->next;
}
fclose(fp);
printf("%d条记录已经存入文件,请继续操作。\n",count);

}
//文件读取操作函数
BOOK *load(BOOK *top)
{

FILE *fp;
BOOK *p,*old;
count=0;

if((fp=fopen("BOOK.txt","rb"))==NULL)
{
    printf("打不开文件!\n");
    exit(1);
}
printf("\n取文件...\n");
ASK(p);
top=p;
old=top;

while(!feof(fp))
{
    if(1!=fread(p,LEN,1,fp))    break;
    count=count+1;
    ASK(p->next);
    old=p->next;
    old=p;
    p=p->next;
}

old->next=NULL;
fclose(fp);
printf("取入%d条记录。",count);

return(top);

}

/*
#include "record.h"
void writeToFile(){
FILE *out;
out = fopen( "BOOK.txt", "wb" );
if(out==NULL){
printf("无法打开文件!\n");
return;
}
p=head;
while(p!=NULL){
fwrite(p,LEN,1,out);
p=p->next;
printf("输出文件!\n");
}
fclose(out);
}

void readFromFile(){
FILE in;
in = fopen( "BOOK.txt", "rb" );
if(in==NULL){
printf("无法打开文件!\n");
return;
}
count=0;
head=NULL;
p=NULL;
old=NULL;
ASK(p);
while(!feof(in)){
if(fread(p,LEN,1,in)!=1)
break;
if(head==NULL){
head=p;
}else{
old->next=p;
}
old=p;
count++;
printf("读入文件!\n");
ASK(p);
}
old->next=NULL;
printf("readin count:%d\n",count);
fclose(in);
}
/