上一篇文章我们详细讲了文件操作,这时候我们就可以把通讯录保存到文件中,这样即使程序退出了,联系人的信息也还是保存着,下一次启动程序时我们就可以把文件中的数据读取到程序中来使用。
保存
首先我们要在退出通讯录之前把联系人的信息都保存到文件中。
//退出前存储到文件中
void Save_Contact(Contact* pc)
{
assert(pc);
FILE*pf=fopen("contact.txt", "wb");
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (fwrite((&pc->data[i]), sizeof(People), 1, pf) != 1)
{
perror("fwrite fail");
exit(-1);
}
}
fclose(pf);
pf = NULL;
}
我们可以像这样一个一个保存进去,这样如果在中间某一个数据保存失败时就会退出程序,并且打印提示信息。
这时候我们就能发现文件中已经存进去内容了。
读取文件
读取文件的操作应该在初始化之后就读取,,读取文件的时候,我们首先要进行判断我们的工程里面是否有没有这个文件,比如第一次使用通讯录的时候,我们还没有创建这个文件,只有在第一次使用结束的时候我们才会创建。读取的时候我们也一个一个的读取,防止中间读取失败,每次读取之前判断一下size和count是否相等,是否需要扩容。
//读取数据
void ReadtoContact(Contact* pc)
{
assert(pc);
FILE* pf = fopen("contact.txt", "rb");
if (pf != NULL)
{
People tmp;
while (fread(&tmp, sizeof(People), 1, pf) == 1)
{
Check(pc);
pc->data[pc->count] = tmp;
pc->count++;
}
fclose(pf);
pf = NULL;
}
}
要注意区分写入数据的是,我们不知道文件中存了几个联系人的信息,所以我们只能通过fread函数的返回值来判断是否读取结束。
功能测试
我们先将之前测试生成的contact.txt文件删除掉,首先测试一下初始化通讯录时会不会出现一些多余的数据
我们可以看到第一次进来通讯录时是不会载入任何内容的。
接着我们添加几个联系人进去,再退出程序,看是否会生成应该txt文件。
如图我们已经添加了几个联系人,并且退出了程序。这是我们右击源文件点击添加现有项
我们就能发现在我们的工程目录下已经创建了一个通讯录的文件
当我们添加进来之后打开这个文件,会发现文件已经有了内容,虽然我们看不懂,因为我们是以二进制形式写入的,之后我们也会用二进制的形式读取数据。
这时候我们再次打开程序,然后直接选择 6 查看联系人
我们就能确定上一次程序退出之前确实已经把数据存到文件中去了,而且我们读取数据的函数也没问题。
增加了这两个函数就能够将通讯录升级到文件版本了。