本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1. 改进通讯录
1.1 用枚举改进test.c中的目录
改进目的:增加代码的可读性 利用枚举类型的取值代替数字选项
enum Option
{
EXIT,//0
ADD,//1
DEL,//2
SEARCH,//3
MODIFY,//4
SORT,//5
SHOW//6
};
原来
现在
我们可以看到原本的数字变成更具体的功能,在编程过程中就不必回看目录了
1.2 用动态内存管理改进项目
1.2.1 改进结构体声明
原来:
现在改为:
typedef struct Contact
{
//PeoInfo data[MAX];
PeoInfo* data;//存放数据
int sz;//通讯录中有效信息的个数
int capacity;//记录当前通讯录的最大容量
}Contact;
1.2.2 改进初始化函数
//void InitContact(Contact *pc)
//{
// assert(pc);
// pc->sz = 0;
// memset(pc->data, 0, sizeof(pc->data));
//}
void InitContact(Contact* pc)
{
assert(pc);
pc->sz = 0;
PeoInfo* tmp = (PeoInfo*)malloc(DEFAULT_SZ *sizeof(PeoInfo));
if (tmp != NULL)
{
pc->data = tmp;
}
else
{
printf("InitContact()::%s\n", strerror(errno));
return;
}
pc->capacity = DEFAULT_SZ;
}
不要忘记定义#define DEFAULT_SZ 3
- 改进AddContact函数 为了让增加功能函数的容量每当不够就增加2,我们新写一个check_capacity函数,再在AddContact中调用
void check_capacity(Contact* pc)
{
assert(pc);
if (pc->sz == pc->capacity)
{
//增加容量
PeoInfo* tmp = (PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(PeoInfo));
if (tmp != NULL)
{
pc->data = tmp;
pc->capacity += 2;
printf("增容成功\n");
}
else
{
printf("check_capacity()::%s\n", strerror(errno));
}
}
}
1.3 用文件操作知识保存通讯录中信息
1.3.1 退出时保存信息
增加一个函数,打开一个二进制文件用于保存信息。
void SaveContact(Contact* pc)
{
//打开文件
FILE *pf = fopen("contact.txt", "wb");
if (pf == NULL)
{
printf("SaveContact:%s\n", strerror(errno));
return;
}
//写文件(存二进制)
int i = 0;
for (i = 0; i < pc->sz; i++)
{
fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
}
//关闭文件
fclose(pf);
pf = NULL;
}
1.3.2 开启时读取信息
封装一个函数,在初始化时读取二进制文件里的信息
void LoadContact(Contact *pc)
{
//从文件加载信息
FILE *pf = fopen("contact.txt", "rb");
if (pf == NULL)
{
printf("InitContact::open for reading:%s\n", strerror(errno));
return;
}
//读取信息
PeoInfo tmp = { 0 };
while (fread(&tmp,sizeof(PeoInfo),1,pf))//fread返回的是实际上读取到的数据,如果没读取到就返回0
{
check_capacity(pc);//检测容量是否足够
pc->data[pc->sz] = tmp;
pc->sz++;
}
//关闭文件
fclose(pf);
pf = NULL;
}
随着我们学习的内容增加,我们能用c语言做的事也会变多,这些改进只是目前我想到能改的部分,以后还会不断改进代码,不断进步