在实现通讯录功能时,保存的联系人信息无法从文件中读入内存

主要问题应该是在程序读取原来存储的信息时,判断读取文件为空。

#include<stdio.h>
#include<stdlib.h>
typedef struct DataType{
int ID;//编号
char name[10];//姓名
int age;
char ch[15];//性别
char phone[13];//电话
char addr[31]; //住址
}DataType;//联系人信息
typedef struct Contact
{
DataType data;//联系人信息
int ContactNumber;//联系人个数
int Capacity;//通讯录大小
}Contact;
void InitContact(Contact &AddressBook);//通讯录初始化
void AddContact(Contact &AddressBook); //添加联系人
void DistroyContact(Contact &AddressBook);//销毁通讯录
void ShowContact(Contact &AddressBook);//展示联系人信息
void DeleteContact(Contact &AddressBook);//删除联系人信息
void SearchContact(Contact &AddressBook);//查找联系人信息
void ModifyContact(Contact &AddressBook);//修改联系人信息
void ExpandContact(Contact &AddressBook);//扩大通讯录内存
void LoadContact(Contact &AddressBook);
void SaveContact(Contact &AddressBook);
int main(void)
{
Contact AddressBook;//创建通讯录
InitContact(AddressBook);
LoadContact(AddressBook);
int a;
while(1)
{
printf("\t\t\t\t\t\t******************************\n");
printf("\t\t\t\t\t\t
通讯录管理系统 *\n");
printf("\t\t\t\t\t\t
\n");
printf("\t\t\t\t\t\t* 1.添加联系人 \n");
printf("\t\t\t\t\t\t
2.删除联系人 \n");
printf("\t\t\t\t\t\t
3.查找联系人 \n");
printf("\t\t\t\t\t\t
4.修改联系人 \n");
printf("\t\t\t\t\t\t
5.显示联系人 \n");
printf("\t\t\t\t\t\t
0.退出通讯录 *\n");
printf("\t\t\t\t\t\t
\n");
printf("\t\t\t\t\t\t
****************************\n");
printf("请输入操作:\n");
scanf("%d",&a);
switch(a)
{
case 1:AddContact(AddressBook);break;
case 2:DeleteContact(AddressBook);break;
case 3:SearchContact(AddressBook);break;
case 4:ModifyContact(AddressBook);break;
case 5:ShowContact(AddressBook);break;
case 0:SaveContact(AddressBook);
AddressBook.data=NULL;
AddressBook.Capacity=0;
AddressBook.ContactNumber=0;
return 0;
default:printf("错误操作!\n");break;
}
}
}
void InitContact(Contact &AddressBook)
{
AddressBook.ContactNumber=0;
AddressBook.data=(DataType
)malloc(10*sizeof(DataType));//通讯录的初始内存大小为10
AddressBook.Capacity=10;
}
void ExpandContact(Contact &AddressBook)
{
if(AddressBook.ContactNumber==AddressBook.Capacity)
{
printf("检测到通讯录内存不足,正在为您自动扩容\n");
DataType newbase=(DataType)realloc(AddressBook.data,(AddressBook.Capacity+5)*sizeof(DataType));
//为通讯录扩大5个内存
if(newbase!=NULL)
{
AddressBook.data=newbase;
AddressBook.Capacity+=5;
printf("扩容成功/n");
}
else
{
printf("扩容失败\n");
exit(1);
}
}
}
void AddContact(Contact &AddressBook)
{
int flag;
int a;
while(1)
{
ExpandContact(AddressBook);//检查通讯录内存是否需要扩大
flag=AddressBook.ContactNumber+1;//当前联系人编号
AddressBook.data[flag].ID=flag;
printf("当前添加的联系人编号为%d\n",flag);
printf("请输入联系人姓名:\n");
scanf("%s",&AddressBook.data[flag].name);
getchar();
printf("请输入联系人年龄:\n");
scanf("%d",&AddressBook.data[flag].age);
getchar();
printf("请输入联系人性别:\n");
scanf("%s",&AddressBook.data[flag].ch);
getchar();
printf("请输入联系人电话:\n");
scanf("%s",&AddressBook.data[flag].phone);
getchar();
printf("请输入联系人住址:\n");
scanf("%s",&AddressBook.data[flag].addr);
getchar();
printf("添加成功!\n");
AddressBook.ContactNumber++;
printf("继续添加请输入1,结束添加请输入0:\n");
scanf("%d",&a);
if(a==0)
{
return;
}
}
}
void ShowContact(Contact &AddressBook)
{
if(AddressBook.ContactNumber==0)
{
printf("通讯录为空,显示失败!\n");
return;
}
int i;
printf("\t\t--------------------------------------------------------------------------------------\n");
printf("\t\t--------------------------------------------------------------------------------------\n");
printf("\t%15s\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","编号","姓名","年龄","性别","电话","住址");
for(i=1;i<=AddressBook.ContactNumber;i++)
{
printf("\t%15d\t%15s\t%15d\t%15s\t%15s\t%15s\n",AddressBook.data[i].ID,AddressBook.data[i].name,AddressBook.data[i].age,AddressBook.data[i].ch,AddressBook.data[i].phone,AddressBook.data[i].addr);
}
printf("\t\t--------------------------------------------------------------------------------------\n");
printf("\t\t--------------------------------------------------------------------------------------\n");
}
int FindContactName(Contact &AddressBook,char *name)//查找待操作联系人姓名
{
int i;
for(i=1;i<=AddressBook.ContactNumber;i++)
{
if(name==AddressBook.data[i].name)
{
return i;//记录待操作联系人的编号
}
}
return -1;//查找失败
}
void DeleteContact(Contact &AddressBook)
{
if(AddressBook.ContactNumber==0)
{
printf("通讯录为空,删除失败!");
}
char name[10];
printf("请输入要删除的联系人姓名:\n");
scanf("%s",&name);
int flag =FindContactName(AddressBook,name);
if(flag==-1)
{
printf("联系人不存在!\n");
}
else
{
for(int i=flag;i<=AddressBook.ContactNumber;i++)
{
AddressBook.data[i]=AddressBook.data[i+1];
}
AddressBook.ContactNumber--;
printf("删除成功!\n");
}
}
void SearchContact(Contact &AddressBook)
{
if(AddressBook.ContactNumber==0)
{
printf("通讯录为空,查找失败!");
}
char name[10];
printf("请输入要查找的联系人姓名:\n");
scanf("%s",&name);
int flag =FindContactName(AddressBook,name);
if(flag==-1)
{
printf("联系人不存在!\n");
}
else
{
printf("\t%15s\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","编号","姓名","年龄","性别","电话","住址");
printf("\t%15d\t%15s\t%15d\t%15s\t%15s\t%15s\n",AddressBook.data[flag].ID,AddressBook.data[flag].name,AddressBook.data[flag].age,AddressBook.data[flag].ch,AddressBook.data[flag].phone,AddressBook.data[flag].addr);
}
}
void ModifyContact(Contact &AddressBook)
{
if(AddressBook.ContactNumber==0)
{
printf("通讯录为空,修改失败!");
}
char name[10];
printf("请输入要修改的联系人姓名:\n");
scanf("%s",&name);
int flag=FindContactName(AddressBook,name);
if(flag==-1)
{
printf("联系人不存在!\n");
}
else
{
printf("请输入新的联系人姓名:\n");
scanf("%s",&AddressBook.data[flag].name);
printf("请输入新的联系人年龄:\n");
scanf("%d",&AddressBook.data[flag].age);
printf("请输入新的联系人性别:\n");
scanf("%s",&AddressBook.data[flag].ch);
printf("请输入新的联系人电话:\n");
scanf("%s",&AddressBook.data[flag].phone);
printf("请输入新的联系人住址:\n");
scanf("%s",&AddressBook.data[flag].addr);
}
printf("修改成功");
}
void LoadContact(Contact &AddressBook)
{
FILE *wj=fopen("contact.txt","rb");
if(wj==NULL)
{
perror("contact:fopen");
return;
}
DataType a={0};
while(fread(&a,sizeof(DataType),1,wj))
{
ExpandContact(AddressBook);
AddressBook.ContactNumber++;
AddressBook.data[AddressBook.ContactNumber]=a;

}
fclose(wj);//关闭文件
wj =NULL; 

}
void SaveContact(Contact &AddressBook)
{
FILE *wj=fopen("contact.text","wb");
if(wj==NULL)
{
perror("SaveContact:fopen");
return;
}
int i;
for(i=1;i<=AddressBook.ContactNumber;i++)
{
fwrite(&(AddressBook.data[i]),sizeof(DataType),1,wj);
}
fclose(wj);
wj=NULL;
}

两个问题
1、文件名字后缀写错了,对不上
2、scanf接收输入时,数组变量不需要取地址 &

#include <stdio.h>
#include <stdlib.h>

typedef struct DataType{
    int ID;//编号
    char name[10];//姓名
    int age;
    char ch[15];//性别
    char phone[13];//电话
    char addr[31]; //住址
}DataType;//联系人信息
typedef struct Contact
{
    DataType *data;//联系人信息
    int ContactNumber;//联系人个数
    int Capacity;//通讯录大小
}Contact;
void InitContact(Contact &AddressBook);//通讯录初始化
void AddContact(Contact &AddressBook); //添加联系人
void DistroyContact(Contact &AddressBook);//销毁通讯录
void ShowContact(Contact &AddressBook);//展示联系人信息
void DeleteContact(Contact &AddressBook);//删除联系人信息
void SearchContact(Contact &AddressBook);//查找联系人信息
void ModifyContact(Contact &AddressBook);//修改联系人信息
void ExpandContact(Contact &AddressBook);//扩大通讯录内存
void LoadContact(Contact &AddressBook);
void SaveContact(Contact &AddressBook);

int main()
{
    Contact AddressBook;//创建通讯录
    InitContact(AddressBook);
    LoadContact(AddressBook);
    int a;
    while(1)
    {
        printf("\t\t\t\t\t\t******************************\n");
        printf("\t\t\t\t\t\t 通讯录管理系统 *\n");
        printf("\t\t\t\t\t\t\n");
        printf("\t\t\t\t\t\t* 1.添加联系人 \n");
        printf("\t\t\t\t\t\t 2.删除联系人 \n");
        printf("\t\t\t\t\t\t 3.查找联系人 \n");
        printf("\t\t\t\t\t\t 4.修改联系人 \n");
        printf("\t\t\t\t\t\t 5.显示联系人 \n");
        printf("\t\t\t\t\t\t 0.退出通讯录 *\n");
        printf("\t\t\t\t\t\t\n");
        printf("\t\t\t\t\t\t****************************\n");
        printf("请输入操作:\n");
        scanf("%d",&a);
        switch(a)
        {
            case 1:AddContact(AddressBook);break;
            case 2:DeleteContact(AddressBook);break;
            case 3:SearchContact(AddressBook);break;
            case 4:ModifyContact(AddressBook);break;
            case 5:ShowContact(AddressBook);break;
            case 0:SaveContact(AddressBook);
                AddressBook.data=NULL;
                AddressBook.Capacity=0;
                AddressBook.ContactNumber=0;
                return 0;
            default:printf("错误操作!\n");break;
        }
    }
    return 0;
}

void InitContact(Contact &AddressBook)
{
    AddressBook.ContactNumber=0;
    AddressBook.data=(DataType *)malloc(10*sizeof(DataType));//通讯录的初始内存大小为10
    AddressBook.Capacity=10;
}
void ExpandContact(Contact &AddressBook)
{
    if(AddressBook.ContactNumber==AddressBook.Capacity)
    {
        printf("检测到通讯录内存不足,正在为您自动扩容\n");
        DataType *newbase=(DataType*)realloc(AddressBook.data,(AddressBook.Capacity+5)*sizeof(DataType));
        //为通讯录扩大5个内存
        if(newbase!=NULL)
        {
            AddressBook.data=newbase;
            AddressBook.Capacity+=5;
            printf("扩容成功/n");
        }
        else
        {
            printf("扩容失败\n");
            exit(1);
        }
    }
}
void AddContact(Contact &AddressBook)
{
    int flag;
    int a;
    while(1)
    {
        ExpandContact(AddressBook);//检查通讯录内存是否需要扩大
        flag=AddressBook.ContactNumber+1;//当前联系人编号
        AddressBook.data[flag].ID=flag;
        printf("当前添加的联系人编号为%d\n",flag);
        printf("请输入联系人姓名:\n");
        scanf("%s",AddressBook.data[flag].name);
        getchar();
        printf("请输入联系人年龄:\n");
        scanf("%d",&AddressBook.data[flag].age);
        getchar();
        printf("请输入联系人性别:\n");
        scanf("%s",AddressBook.data[flag].ch);
        getchar();
        printf("请输入联系人电话:\n");
        scanf("%s",AddressBook.data[flag].phone);
        getchar();
        printf("请输入联系人住址:\n");
        scanf("%s",AddressBook.data[flag].addr);
        getchar();
        printf("添加成功!\n");
        AddressBook.ContactNumber++;
        printf("继续添加请输入1,结束添加请输入0:\n");
        scanf("%d",&a);
        if(a==0)
        {
            return;
        }
    }
}
void ShowContact(Contact &AddressBook)
{
    if(AddressBook.ContactNumber==0)
    {
        printf("通讯录为空,显示失败!\n");
        return;
    }
    int i;
    printf("\t\t--------------------------------------------------------------------------------------\n");
    printf("\t\t--------------------------------------------------------------------------------------\n");
    printf("\t%15s\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","编号","姓名","年龄","性别","电话","住址");
    for(i=1;i<=AddressBook.ContactNumber;i++)
    {
        printf("\t%15d\t%15s\t%15d\t%15s\t%15s\t%15s\n",AddressBook.data[i].ID,AddressBook.data[i].name,AddressBook.data[i].age,AddressBook.data[i].ch,AddressBook.data[i].phone,AddressBook.data[i].addr);
    }
    printf("\t\t--------------------------------------------------------------------------------------\n");
    printf("\t\t--------------------------------------------------------------------------------------\n");
}
int FindContactName(Contact &AddressBook,char *name)//查找待操作联系人姓名
{
    int i;
    for(i=1;i<=AddressBook.ContactNumber;i++)
    {
        if(name==AddressBook.data[i].name)
        {
            return i;//记录待操作联系人的编号
        }
    }
    return -1;//查找失败
}
void DeleteContact(Contact &AddressBook)
{
    if(AddressBook.ContactNumber==0)
    {
        printf("通讯录为空,删除失败!");
    }
    char name[10];
    printf("请输入要删除的联系人姓名:\n");
    scanf("%s",name);
    int flag =FindContactName(AddressBook,name);
    if(flag==-1)
    {
        printf("联系人不存在!\n");
    }
    else
    {
        for(int i=flag;i<=AddressBook.ContactNumber;i++)
        {
            AddressBook.data[i]=AddressBook.data[i+1];
        }
        AddressBook.ContactNumber--;
        printf("删除成功!\n");
    }
}
void SearchContact(Contact &AddressBook)
{
    if(AddressBook.ContactNumber==0)
    {
        printf("通讯录为空,查找失败!");
    }
    char name[10];
    printf("请输入要查找的联系人姓名:\n");
    scanf("%s",name);
    int flag =FindContactName(AddressBook,name);
    if(flag==-1)
    {
        printf("联系人不存在!\n");
    }
    else
    {
        printf("\t%15s\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","编号","姓名","年龄","性别","电话","住址");
        printf("\t%15d\t%15s\t%15d\t%15s\t%15s\t%15s\n",AddressBook.data[flag].ID,AddressBook.data[flag].name,AddressBook.data[flag].age,AddressBook.data[flag].ch,AddressBook.data[flag].phone,AddressBook.data[flag].addr);
    }
}
void ModifyContact(Contact &AddressBook)
{
    if(AddressBook.ContactNumber==0)
    {
        printf("通讯录为空,修改失败!");
    }
    char name[10];
    printf("请输入要修改的联系人姓名:\n");
    scanf("%s",name);
    int flag=FindContactName(AddressBook,name);
    if(flag==-1)
    {
        printf("联系人不存在!\n");
    }
    else
    {
        printf("请输入新的联系人姓名:\n");
        scanf("%s",AddressBook.data[flag].name);
        printf("请输入新的联系人年龄:\n");
        scanf("%d",&AddressBook.data[flag].age);
        printf("请输入新的联系人性别:\n");
        scanf("%s",AddressBook.data[flag].ch);
        printf("请输入新的联系人电话:\n");
        scanf("%s",AddressBook.data[flag].phone);
        printf("请输入新的联系人住址:\n");
        scanf("%s",AddressBook.data[flag].addr);
    }
    printf("修改成功");
}
void LoadContact(Contact &AddressBook)
{
    FILE *wj=fopen("contact.txt","rb");
    if(wj==NULL)
    {
        perror("contact:fopen");
        return;
    }
    DataType a;
    while(fread(&a,sizeof(DataType),1,wj))
    {
        ExpandContact(AddressBook);
        AddressBook.ContactNumber++;
        AddressBook.data[AddressBook.ContactNumber]=a;
    }
    fclose(wj);//关闭文件
    wj =NULL;
}
void SaveContact(Contact &AddressBook)
{
    FILE *wj=fopen("contact.txt","wb");
    if(wj==NULL)
    {
        perror("SaveContact:fopen");
        return;
    }
    int i;
    for(i=1;i<=AddressBook.ContactNumber;i++)
    {
        fwrite(&(AddressBook.data[i]),sizeof(DataType),1,wj);
    }
    fclose(wj);
    wj=NULL;
}