关于Debug Assertion Failed!解决办法

关于Debug Assertion Failed!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define filename (c:\\zj.txt)  //文件位置 
#define N 100   //最大员工数 
typedef struct member
{
char name[20];
int  no;
char sex[10];
char birthday[30];
char marry[10];
int  child;
}ST;
ST jober[N];   //公会成员

/************************************
            登陆函数
*************************************/ 
void login()
{
char password[20] , username[20];
char name[20]     , word[20];
int flag = 0;
FILE *fp = NULL;
if( NULL == (fp=fopen("c:\\zj.txt","rb+")) )
{
printf("不能打开文件请查找C盘根目录下是否有zj.txt!");
getchar();
exit(1);
}
fread(username,sizeof(username),1,fp);
fread(password,sizeof(password),1,fp);
printf("请输入用户名和密码并用空格隔开(默认用户名密码admin admin):");
while(flag < 3)
{
scanf("%s %s",&name[0],&word[0]);
if(strcmp(username,name) == 0 && strcmp(password,word) == 0)
break;
else
{
printf("用户名或密码错误请重新输入:");
flag++;
}
}
fclose(fp);
fp = NULL;
if(flag>2)
{
printf("密码错误次数过多  退出系统!!!");
getchar();
getchar();
exit(1);
}
}

/************************************
函数声明区
************************************/
void input(ST *a);
int select();
void pandect();

int main(void)
{
int x = 0; 
login();
while(1)
{
printf("\n*******************************************\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("*        6:修改密码                      *\n");
printf("*        7:退出程序                      *\n");
printf("*                                         *\n");
printf("*******************************************\n");
scanf_s("%d",&x,1);
switch(x)
{
case 1: input(jober); break;
case 2: pandect();    break;
case 3:   ;break;
case 4:   ;break;
case 5:   ;break;
case 6:   ;break;
case 7:exit(1);break;
default:   ;break;

}
}
return 0;
}
/***********************
 选择Y / N
返回值0或者1
************************/
int select()
{
char tmp;
scanf("%c",&tmp);
if(tmp == 89 || tmp == 67)
return 1;
else if(tmp == 78 || tmp == 46)
return 0;
else
{
printf("输入错误 请重新输入!!!");
select();
}
}

/************************
信息录入
*************************/
void input(ST *a)
{
FILE *fp = NULL;
int x = 1;
fp=fopen("c:\\zj.txt","ab+");
while(x)
{
printf("请输入成员姓名,工号,性别,生日,婚否,子女数 并用空格隔开:");
printf("\n            ");
scanf("%s %d %s %s %s %d",a->name,&(a->no),a->sex,a->birthday,a->marry,&(a->child));
fwrite(a,sizeof(ST),1,fp);
printf("请问还需要录入吗?  Y/N  :");
printf("\n");
x = select();
}
fclose(fp);
fp = NULL;
}

/************************
信息总览
************************/
void pandect()
{
FILE *fp = NULL;
int x = 0;long t;
fp = fopen("c:\\zj.txt","rb+");
fseek(fp,0L,2);
t = ftell(fp);
rewind(fp);
t = t/sizeof(ST);
printf("公会成员数:%d\n",t);
fseek(fp,40L,0);
fread(jober,sizeof(ST),100,fp);
while(x < t)
{
printf("姓名:%s  工号:%d   性别:%s   \n生日:%s      婚否:%s     子女数:%d   \n",jober[x].name,jober[x].no,jober[x].sex,jober[x].birthday,jober[x].marry,jober[x].child);
printf("\n");
x++;
fclose(fp);
fp = NULL;
}
}
------解决思路----------------------
fclose(fp);应在while外面