主要问题应该是在程序读取原来存储的信息时,判断读取文件为空。
#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;
}