拉普兰德做的到吗? 2022-12-04 16:05 采纳率: 100%
浏览 49
已结题

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

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

#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条回答 默认 最新

  • 叶落花枯 2022-12-04 16:20
    关注

    两个问题
    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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月4日
  • 已采纳回答 12月4日
  • 修改了问题 12月4日
  • 创建了问题 12月4日