在退出文件前,将文件以二进制的形式写入一个记事本中
将文件写入时需要一个一个的放入,使用 fwrite 函数。
void KEEPContact(Contact* pc)
{
//打开文件
FILE* pf = fopen("contact.txt","wb");
// wb --- 为了输出数据,打开一个二进制文件
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
int i = 0;
for (i = 0; i < pc->sum; i++)
{
fwrite(pc->data + i, sizeof(struct ID), 1, pf);
}
//关闭文件
fclose(pf);
pf = NULL;
printf("(文件)保存成功\n");
return 0;
}
效果为:
在初始化通讯录时,可以读取到contact.txt文件中的内容
fread返回的是实际上读取到有效信息的人数
在读取信息时,需要创建一个临时变量
//动态版本
int CheckCapacity(Contact* pc);//声明 --- 判断有效人数,即是否需要进行增容
void LoadContact(Contact* pc)
{
//打开文件
FILE* pf = fopen("contact.txt", "rb");
if (pf == NULL)
{
perror("fopen");
return ;
}
//读文件
//需要判断当前通讯录中有效信息的人数
Peopleone tmp = { 0 };
while (fread(&tmp,sizeof(struct ID),1,pf))
{
CheckCapacity(pc);
//当读取完成放入时,需要检测当前容量
pc->data[pc->sum] = tmp;
pc->sum++;
}
//关闭文件
fclose(pf);
pf = NULL;
}
void InitContact(Contact* pc)
{
pc->data = (Peopleone*)malloc(DEFAULT_SZ * sizeof(Peopleone));
if (pc->data == NULL)
{
printf("通讯录初始化失败—> %s\n", strerror(errno));
return;
}
pc->sum = 0;
pc->capacity = DEFAULT_SZ;
printf("初始化通讯录成功\n");
//加载文件的信息到通讯录
LoadContact(pc);
}
//若扩容失败,返回值为0
//扩容成功,或者不需要扩容,返回值为 1
int CheckCapacity(Contact* pc)
{
//通讯录中的有效信息人数 等于 通讯录当前的容量
if (pc->sum == pc->capacity)
{
Peopleone* ptr = (Peopleone*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(Peopleone));
if (ptr == NULL)
{
printf("CheckCapacity:% s\n", strerror(errno));
return 0;
}
else
{
pc->data = ptr;
pc->capacity += INC_SZ;
printf("增容成功,当前容量为:%d\n", pc->capacity);
return 1;
}
}
return 1;
}
效果为: