输出出现问题,在对文件进行修改后,再次打开文件进行输出时出现错误,如何解决?(语言-c语言)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 100
struct contact_type
{

char name[10];
char hometown[10];
long number[2];
char mail[10];

}cont[LEN];
void show();
void chon(int n,FILE *fp,struct contact_type *p)//重新写入
{
FILE *fp1;
int i=0;
fp=fopen("con.dat", "r+");
fp1=fopen("linshi.dat", "w+");//读写新建一个临时文件
for(i=0;i<n;i++)
{
fprintf(fp1,"%s%s%ld%ld%s\n",(p+i)->name,(p+i)->hometown,(p+i)->number[0],(p+i)->number[1],(p+i)->mail);
}
fclose(fp);
fclose(fp1);
remove("con.dat");
rename("linshi.dat", "con.dat");
}
void revise(int n,struct contact_type *p,FILE *fp)//文件修改
{
int i=0,j=0;
char c[10];
printf("请输入想要修改的对象:\n");
scanf("%s",&c);
for(i=0;i<n;i++)
{
if(strcmp(c,(p+i)->name)==0)
{
j=i;
printf("修改前信息:姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n",(p+i)->name,(p+i)->hometown,(p+i)->number[0],(p+i)->number[1],(p+i)->mail);
break;
}
}
printf("请输入修改后的信息\n");
scanf("%s%s%ld%ld%s",&(p+j)->name,&(p+j)->hometown,&(p+j)->number[0],&(p+j)->number[1],&(p+j)->mail);
printf("%s\n",c);
printf("%d\n",j);
if(fwrite(&p[j],sizeof(struct contact_type),1,fp)!=1)
printf("file write error\n");
fclose(fp);
chon(n,fp,p);
}

void save()//文件输入
{
int i=0;
FILE *fp;
if((fp=fopen("con.dat","web"))==NULL)
{
printf("can not open file\n");
return ;
}
for(i=0;i<LEN;i++)
if(fwrite(&cont[i],sizeof(struct contact_type),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
int creat(int i,struct contact_type cont[LEN])//文件输入
{
char c;
printf("请依次输入姓名,籍贯,电话号码1,电话号码2,电子邮箱(中间用空格隔开,以! ! ! ! !结束输入):\n");
do
{
scanf("%s%s%ld%ld%s",&cont[i].name,&cont[i].hometown,&cont[i].number[0],&cont[i].number[1],&cont[i].mail);
i=i+1;
}
while(c=getchar()!='!');
fflush(stdin);//清除键盘缓冲区
save();
return (i);

}
int main()
{
FILE *fp;
int i=0,n=0,m=0;
struct contact_type *p;
p=cont;
n=creat(i,cont)-1;
if((fp=fopen("con.dat","rb"))==NULL)
{
printf("can not open file\n");
exit(0);
}
for(i=0;i<n;i++)
{
fread(&cont[i],sizeof(struct contact_type),1,fp);
printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n",cont[i].name,cont[i].hometown,cont[i].number[0],cont[i].number[1],cont[i].mail);
}
revise(n,p,fp);
fclose(fp);
if((fp=fopen("con.dat","rb"))==NULL)
{
printf("can not open file\n");
exit(0);
}
for(i=0;i<n;i++)
{
fread(&cont[i],sizeof(struct contact_type),1,fp);
printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n",cont[i].name,cont[i].hometown,cont[i].number[0],cont[i].number[1],cont[i].mail);
}

return 0;

}

修改完善如下,具体见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 100
struct contact_type
{
    char name[10];
    char hometown[10];
    long number[2];
    char mail[10];
}cont[LEN];
//void show();
void chon(int n, FILE* fp, struct contact_type* p)//重新写入
{
    FILE* fp1;
    int i = 0;
    //fp = fopen("conn.dat", "r+");  // fopen("con.dat", "r+")
    fp1 = fopen("linshi.dat", "w+");//读写新建一个临时文件
    for (i = 0; i < n; i++)
    {
        fwrite(p + i, sizeof(struct contact_type), 1, fp);
        //fprintf(fp1, "%s%s%ld%ld%s\n", (p + i)->name, (p + i)->hometown,
        //    (p + i)->number[0], (p + i)->number[1], (p + i)->mail);
    }
    //fclose(fp);
    fclose(fp1);
    remove("conn.dat");  //remove("con.dat");
    rename("linshi.dat", "conn.dat");
}
void revise(int n, struct contact_type* p, FILE* fp)//文件修改
{
    int i = 0, j = -1;
    char c[10];
    printf("请输入想要修改的对象姓名:\n");
    scanf("%s", c);
    //scanf("%s", &c);
    for (i = 0; i < n; i++)
    {
        if (strcmp(c, (p + i)->name) == 0)
        {
            j = i;
            printf("修改前信息:姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n", 
                (p + i)->name, (p + i)->hometown, (p + i)->number[0], (p + i)->number[1], (p + i)->mail);
            break;
        }
    }
    if (j != -1 && j < n) {
        printf("请输入修改的信息(姓名 籍贯 电话号码1 电话号码2 电子邮箱):\n");
        scanf("%s%s%ld%ld%s", (p + j)->name, (p + j)->hometown,
            &(p + j)->number[0], &(p + j)->number[1], (p + j)->mail);
        //scanf("%s%s%ld%ld%s", &(p + j)->name, &(p + j)->hometown, 
        //&(p + j)->number[0], &(p + j)->number[1], &(p + j)->mail);
        printf("%s\n", c);
        printf("%d\n", j);
        //if (fwrite(&p[j], sizeof(struct contact_type), 1, fp) != 1)
        //    printf("file write error\n");
        //fclose(fp);
        chon(n, fp, p);
    }
    else
        printf("未找到相关记录!\n");
}
void save(int n)//文件输入
{
    int i = 0;
    FILE* fp;
    if ((fp = fopen("conn.dat", "wb")) == NULL)
    //if ((fp = fopen("con.dat", "web")) == NULL)
    //DOS保留字,表示屏幕。如con 1.txt con就是把1.txt的内容显示在屏幕上。
    //(注意不能用con做文件名)
    {
        printf("can not open file\n");
        return;
    }
    for (i = 0; i < n; i++) {  //for (i = 0; i < LEN; i++)
        if (fwrite(&cont[i], sizeof(struct contact_type), 1, fp) != 1)
            printf("file write error\n");
    }
    fclose(fp);
}
int creat(int i, struct contact_type cont[])//文件输入
{
    char c[10];
    printf("请依次输入姓名,籍贯,电话号码1,电话号码2,电子邮箱(中间用空格隔开,以! ! ! ! !结束输入):\n");
    while(1)  //do
    {
        scanf("%s", c);
        if (strcmp(c, "!") == 0)   break;
        strcpy(cont[i].name, c);
        scanf("%s%ld%ld%s", cont[i].hometown, &cont[i].number[0], &cont[i].number[1], cont[i].mail);
        //scanf("%s%s%ld%ld%s", &cont[i].name, &cont[i].hometown, &cont[i].number[0], &cont[i].number[1], &cont[i].mail);
        i = i + 1;
    } //while (c = getchar() != '!');
      //fflush(stdin);//清除键盘缓冲区
    save(i);
    return (i);
}
int main()
{
    FILE* fp;
    int i = 0, n = 0, m = 0;
    struct contact_type* p;
    p = cont;
    n = creat(i, cont); //n = creat(i, cont) - 1;
    if ((fp = fopen("conn.dat", "rb")) == NULL)  
    //fp = fopen("con.dat", "rb") 不能用con做文件名
    {
        printf("can not open file\n");
        exit(0);
    }
    for (i = 0; i < n; i++)
    {
        fread(&cont[i], sizeof(struct contact_type), 1, fp);
        printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n", cont[i].name, 
                     cont[i].hometown, cont[i].number[0], cont[i].number[1], cont[i].mail);
    }
    fclose(fp);
    revise(n, p, fp);
    if ((fp = fopen("conn.dat", "rb")) == NULL)
        //fp = fopen("con.dat", "rb")
    {
        printf("can not open file\n");
        exit(0);
    }
    for (i = 0; i < n; i++)
    {
        fread(&cont[i], sizeof(struct contact_type), 1, fp);
        printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n", 
            cont[i].name, cont[i].hometown, cont[i].number[0], cont[i].number[1], cont[i].mail);
    }

    return 0;
}

中间有这么两行:
fclose(fp);
chon(n,fp,p);
我具体没测试过, fp被关闭后,还能否被调用