C语言实现通讯录(文件版)
一、学习完C语言文件,可以增加通讯录的以下功能
学习完C语言的文件读写,我们又可以将通讯录增加以下功能:
1.当退出通讯录的时候,把已增加的联系人信息写到文件中。
2.当通讯录初始化的时候,加载(读取)文件里的信息到通讯录 ——(直接使用打印函数可以显示在屏幕上)
二、分析和实现相应函数
分析:
- 当我们退出通讯录的时候要实现通讯录的保存功能 (实现保存通讯录联系人信息到Contact.dat文件)——SaveContact
- 当我们再次运行通讯录并对通讯录进行增删查改的时候,我们就应该要实现将文件中的信息输出到运行框中显示出来——LoadContact
3.当我们实现LoadContact函数的时候,发现要在初始化通讯录函数中就要调用加载函数LoadContact
4.在使用LoadContact函数的时候,发现会有问题——如果文件中联系人的个数大于3(capacity),这时我们将文件读取到程序中这时发现就无法显示文件中所有人的信息。这时我们就要在LoadContact函数中先扩容,再读取。
5.我们发现很多地方要利用扩容,所以我们干脆实现一个扩容函数。
实现:
初始化函数中调用LoadContact
void InitContact( Contact* ps) { assert(ps); ps->data = (PeoInfo*)malloc(default_sz * sizeof(PeoInfo)); if (ps->data == NULL) { perror("InitContact"); return; } ps->size = 0; ps->capacity = default_sz; //把文件中已经存放的通讯录中的信息加载到通讯录中 LoadContact(ps); }
SaveContact函数(保存联系人信息到文件)
SaveContact(Contact* ps) { assert(ps); //打开文件,以写的形式打开--(没有contact.dat的文件会自动创建一个) FILE* pf = fopen("Contact.dat", "w"); if (pf == NULL) { perror("SaveContact"); return; } //写文件 int i = 0; for (i = 0; i < ps->size; i++) { fwrite(ps->data + i, sizeof(PeoInfo), 1, pf); } //关闭文件 fclose(pf); pf = NULL; }
SaveContact函数(保存联系人信息到文件)
SaveContact(Contact* ps) { assert(ps); //打开文件,以写的形式打开--(没有contact.dat的文件会自动创建一个) FILE* pf = fopen("Contact.dat", "w"); if (pf == NULL) { perror("SaveContact"); return; } //写文件 int i = 0; for (i = 0; i < ps->size; i++) { fwrite(ps->data + i, sizeof(PeoInfo), 1, pf); } //关闭文件 fclose(pf); pf = NULL; }
LoadContact函数(读取文件信息到通讯录)
void LoadContact(Contact* ps) { FILE* pf = fopen("Contact.dat", "r"); if (pf== NULL) { printf("LoadContact:"); return; } //读取文件,存放到通讯录中 PeoInfo tmp = { 0 }; while (fread(&tmp, sizeof(PeoInfo), 1, pf)) { CheckCapacity(ps);//要设置扩容(调用扩容函数) ps->data[ps->size] = tmp; ps->size++; } fclose(pf); pf = NULL; }
检查扩容函数
void CheckCapacity(struct Contact* ps) { assert(ps); if (ps->size == ps->capacity) { //增容 struct PeoInfo* ptr = realloc(ps->data, (ps->capacity + 2) * sizeof(PeoInfo)); if (ptr != NULL) { ps->data = ptr; ps->capacity += 2; printf("增容成功\n"); } else { printf("增容失败\n"); } } }
三、 程序运行结果
直接选择5,显示之前的联系人信息