根据最近学习的文件的读写将之前的通讯录进行了一些改进,在程序开始之前加上了一个读入函数,程序末尾加上了一个写出函数。这样,在程序结束的时候,通讯录中的数据将会以文件的形式保存下来,下次再进入程序时,从文件中读取数据就能达到文件备份的效果了。
1、读入函数:
void read_data (Node* h)
{
FILE *fp = fopen("address.txt","ab+"); // 打开"address.txt"文件,没有就创建一个
if (fp == NULL)
{
perror ("fopen");
return;
}
int count = 0;
// 读入记录个数
fread (&count, sizeof(int), 1, fp);
printf ("记录的个数:%d\n", count);
int i;
Node* node = Create_address_list();
for (i = 0; i < count; i++)
{
int len1;
// 读入数据长度
fread (&len1, sizeof(int), 1, fp);
// 读入数据
fread (&node->data, len1, 1, fp);
Insert_Last(h, node->data);
}
}
该函数在程序开始后就执行,从文件中读取数据加入到创建好的链表中。读取的格式大致为:读取记录的个数(int 型数据)、读取数据的长度(int 型数据)、读入数据(长度为前一个数据)。
2、写出函数
void write_data (Node* h)
{
FILE *fp = fopen ("address.txt","wb+");
if (fp == NULL)
{
perror ("fopen");
return;
}
Node *tmp = h->next;
if (h->next == NULL)
return;
int len = 0;
while(tmp)
{
tmp = tmp->next;
len++;
}
fwrite (&len, sizeof(int), 1, fp);
tmp = h->next;
do
{
len = sizeof(tmp->data);
fwrite (&len, sizeof(int), 1, fp);
fwrite (&tmp->data, sizeof(tmp->data), 1, fp);
tmp = tmp->next;
}while (tmp);
fclose(fp);
}
这边需要遍历一下链表来判断需要写的数据个数,然后按照之前读入的格式写入address.txt 文件中。