建立网站三大基础,深圳网站建站建设,wordpress文章直接转html,微信小程序订货系统前言
通讯录是一种记录联系人信息的工具#xff0c;包括姓名、电话号码、电子邮件地址、住址等。 文章的一二三章均于上一篇相同#xff0c;可以直接看第四章改造内容。 此通讯录是基于通讯录2.0#xff08;动态增长版#xff09;的基础上进行增加文件操作功能#xff0c…前言
通讯录是一种记录联系人信息的工具包括姓名、电话号码、电子邮件地址、住址等。 文章的一二三章均于上一篇相同可以直接看第四章改造内容。 此通讯录是基于通讯录2.0动态增长版的基础上进行增加文件操作功能请先看系列文章第二篇再看本篇博客。 ****** 有需要源代码见文章末尾 ****** 系列文章目录
第一篇【C语言】通讯录1.0 静态版 第二篇【C语言】通讯录2.0 动态增长版 第三篇【C语言】通讯录3.0 文件存储版 文章目录 前言系列文章目录一、什么是通讯录二、静态版、动态增长版和文件存储版的区别1. 静态版2. 动态增长版3. 文件存储版 三、通讯录模块组成图文1. 通讯录文件构成2. 通讯录个人信息3. 通讯录功能模块 四、改造通讯录2.0改造目标1. 文件存储通讯录要求2. 需要添加的功能模块 五、如何改进代码演示1. 建立文件2. 写入文件3. 读取文件 六、所有文件代码1.头文件2. 函数文件3. 逻辑测试文件 总结 一、什么是通讯录
通讯录是一种记录联系人信息的工具包括姓名、电话号码、电子邮件地址、住址等。通讯录可以帮助人们管理自己的联系人让人们更轻松地与他人保持联系。通讯录可以在手机、电脑、笔记本等设备上保存也可以在云端储存和同步方便用户随时查看和更新联系人信息。
二、静态版、动态增长版和文件存储版的区别
C语言静态版、动态增长版和文件存储版的区别如下
1. 静态版
静态版在程序编译时就确定了内存大小程序运行期间内存大小不会发生变化因此对于需要处理大量数据或者不确定数据大小的情况不适用。
2. 动态增长版
动态增长版可以在程序运行期间根据需要动态增加内存大小因此适用于处理不确定数据大小的情况。但是动态增长的内存需要手动释放否则会导致内存泄漏。
3. 文件存储版
文件存储版将数据存储在文件中可以持久保存数据并随时读取。但是存储在文件中的数据需要进行IO操作因此相比于内存操作来说效率较低。此外文件存储版不适用于需要频繁修改的数据。
三、通讯录模块组成图文
1. 通讯录文件构成 2. 通讯录个人信息 3. 通讯录功能模块 四、改造通讯录2.0改造目标
1. 文件存储通讯录要求
将通讯录的联系人信息可以保存在文件里保存到通讯录里的文件以二进制文件保存第二次打开时读取文件里上一次保存的联系人信息
2. 需要添加的功能模块 五、如何改进代码演示
1. 建立文件
使用文件操作 fopen 函数来建立一个文件
FILE* pf fopen(data.dat,wb);if (pf NULL){perror(SaveContact);return;}2. 写入文件
使用文件操作 fwrite 函数使用for循环依次将通讯录内容写入文件
//写入文件
void SaveContact(Contact* pc)
{FILE* pf fopen(data.dat,wb);if (pf NULL){perror(SaveContact);return;}int i 0;for (i 0; i pc-sz; i){fwrite(pc-datai, sizeof(PeoInfo), 1, pf);}fclose(pf);pf NULL;printf(保存成功\n);
}3. 读取文件
使用文件操作 fread 函数使用whlie循环先判断fread的返回值为真进入循环使用扩容函数 determine( ) 来判断内存是否充足进行增容
//读取文件
void ReadContact(Contact* pc)
{FILE* pf fopen(data.dat, rb);if (pf NULL){perror(ReadContact);return;}PeoInfo tem { 0 };while (fread (tem, sizeof(PeoInfo), 1, pf)){if (determine(pc) 0){return;}pc-data[pc-sz] tem;pc-sz;}fclose(pf);pf NULL;
}
六、所有文件代码
1.头文件
#pragma once
#includestdio.h
#includeassert.h
#includestring.h
#includestdlib.h#define MAX 100
#define NAME 10
#define SEX 5
#define TELE 12
#define ADDR 30
//使用枚举 定义选择
enum OPTION
{EXIT,//0ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};//个人信息类型声明
typedef struct PeoInfo
{char name[NAME];int age;char sex[SEX];char tele[TELE];char addr[ADDR];
}PeoInfo;//建立通讯录
//静态版
//typedef struct Contact
//{
// PeoInfo data[MAX]; //通讯录数量
// int sz; //目前通讯录内的人数
//}Contact;
//动态版
typedef struct Contact
{PeoInfo* data;int sz;int capacity;}Contact;//函数声明//初始化通讯录
void InitContact(Contact* pc);//增加联系人
void AddContact(Contact* pc);//显示所有联系人的信息
void ShowContact(const Contact* pc);//删除指定联系人
void DelContact(Contact* pc);//查找指定联系人
void SearchContact(const Contact* pc);//修改指定联系人
void ModifyContact(Contact* pc);//释放内存void DestroyContact(Contact* pc);//保存通讯录
void SaveContact(Contact* pc);2. 函数文件
#define _CRT_SECURE_NO_WARNINGS 1
#include addbook.h
void ReadContact(Contact* pc);
//静态版
//void InitContact(Contact* pc)
//{
// assert(pc); //断言
// memset(pc-data, 0, sizeof(pc-data)); //内存函数 data初始化为0
// pc-sz 0;
//}
int determine(Contact* pc)
{assert(pc);if (pc-capacity pc-sz){PeoInfo* ptr (PeoInfo*)realloc(pc-data, (pc-capacity 2) * sizeof(PeoInfo));if (ptr NULL){perror(determine);return 0;}else{pc-capacity 2;pc-data ptr;printf(增容成功\n);return 1;}}return 1;
}
//动态版
void InitContact(Contact* pc)
{assert(pc);pc-data (PeoInfo*)malloc(3 * sizeof(PeoInfo));if (pc-data NULL){perror(InitContact);return;}pc-capacity 3;pc-sz 0;ReadContact(pc);
}
//动态版
void AddContact(Contact* pc)
{assert(pc); //断言if (determine(pc) 0){return;}printf(请输入姓名);scanf(%s, pc-data[pc-sz].name);printf(请输入年龄);scanf(%d, (pc-data[pc-sz].age));printf(请输入性别);scanf(%s, pc-data[pc-sz].sex);printf(请输入电话);scanf(%s, pc-data[pc-sz].tele);printf(请输入地址);scanf(%s, pc-data[pc-sz].addr);pc-sz; //通讯录加1printf(联系人增加成功\n);
}//静态版
//void AddContact(Contact* pc)
//{
// assert(pc); //断言
// if (pc-sz MAX) //如果通讯录已经满了 则返回
// {
// printf(通讯录已满无法添加\n);
// return;
// }
// printf(请输入姓名);
// scanf(%s, pc-data[pc-sz].name);
// printf(请输入年龄);
// scanf(%d, (pc-data[pc-sz].age));
// printf(请输入性别);
// scanf(%s, pc-data[pc-sz].sex);
// printf(请输入电话);
// scanf(%s, pc-data[pc-sz].tele);
// printf(请输入地址);
// scanf(%s, pc-data[pc-sz].addr);
// pc-sz; //通讯录加1
// printf(联系人增加成功\n);
//}
//搜索名字找通讯录函数
static int Findname(const Contact* pc, char na[])
{int i 0;assert(pc na);for (i 0; i pc-sz; i){if (strcmp(pc-data[i].name, na) 0){return i;}}return -1;
}
void DelContact(Contact* pc)
{if (pc-sz 0){printf(通讯录为空\n);return;}char name[NAME] { 0 };assert(pc);//输入要查找的联系人名字printf(请输入要查找的名字);scanf(%s, name);//找到要查找的联系人int del Findname(pc, name);//删除坐标位子的联系人 将后面的联系人进行代替其位置if (del -1){printf(找不到此人不存在\n);return;}else{int i 0;for (i del; i pc-sz; i){pc-data[i] pc-data[i 1];}pc-sz--;}printf(成功删除联系人\n);
}
void ShowContact(const Contact* pc)
{assert(pc);printf(%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n, 名字, 年龄, 性别, 电话, 地址);int i 0;for (i 0; i pc-sz; i){printf(%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n,pc-data[i].name,pc-data[i].age,pc-data[i].sex,pc-data[i].tele,pc-data[i].addr);}printf(通讯录展示完毕\n);
}
void SearchContact(const Contact* pc)
{if (pc-sz 0){printf(通讯录为空\n);return;}char name[NAME] { 0 };assert(pc);//输入要查找的联系人名字printf(请输入要查找的名字);scanf(%s, name);//找到要查找的联系人int i Findname(pc, name);if (i -1){printf(找不到此人不存在\n);return;}else{printf(%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n, 名字, 年龄, 性别, 电话, 地址);printf(%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n,pc-data[i].name,pc-data[i].age,pc-data[i].sex,pc-data[i].tele,pc-data[i].addr);}printf(成功找到联系人\n);
}
void ModifyContact(Contact* pc)
{assert(pc);char name[NAME] { 0 };printf(请输入要修改人的名字:);scanf(%s, name);int mod Findname(pc, name);if (mod -1){printf(找不到,不存在\n);return;}else{printf(请输入姓名);scanf(%s, pc-data[mod].name);printf(请输入年龄);scanf(%d, (pc-data[mod].age));printf(请输入性别);scanf(%s, pc-data[mod].sex);printf(请输入电话);scanf(%s, pc-data[mod].tele);printf(请输入地址);scanf(%s, pc-data[mod].addr);printf(联系人修改成功\n);}
}
void DestroyContact(Contact* pc)
{free(pc-data);pc-data NULL;pc-capacity 0;pc-sz;
}//写入文件
void SaveContact(Contact* pc)
{FILE* pf fopen(data.dat,wb);if (pf NULL){perror(SaveContact);return;}int i 0;for (i 0; i pc-sz; i){fwrite(pc-datai, sizeof(PeoInfo), 1, pf);}fclose(pf);pf NULL;printf(保存成功\n);
}
//读取文件
void ReadContact(Contact* pc)
{FILE* pf fopen(data.dat, rb);if (pf NULL){perror(ReadContact);return;}PeoInfo tem { 0 };while (fread (tem, sizeof(PeoInfo), 1, pf)){if (determine(pc) 0){return;}pc-data[pc-sz] tem;pc-sz;}fclose(pf);pf NULL;
}
3. 逻辑测试文件
#define _CRT_SECURE_NO_WARNINGS 1
#includeaddbook.h
void menu()
{printf(********************************\n);printf(***** 1. ADD 2. DEL *****\n);printf(***** 3. SEARCH 4. MODIFY *****\n);printf(***** 5. SHOW 6. SORT *****\n);printf(***** 0. EXIT *****\n);printf(********************************\n);}void test()
{int input 0;Contact con;InitContact(con);do{menu();printf(请选择);scanf(%d, input);switch (input){case ADD:AddContact(con);break;case DEL:DelContact(con);break;case SEARCH:SearchContact(con);break;case MODIFY:ModifyContact(con);break;case SHOW:ShowContact(con);break;case SORT:printf(功能待开发\n);break;case EXIT:SaveContact(con);DestroyContact(con);printf(成功退出通讯录\n);break;default:printf(输入错误请重新输入\n);break;}} while (input);}
int main()
{test();return 0;
}总结
本期博客是通讯录3.0文件存储版是对前面所学知识进行复习编写通讯录时有助于理解自定义类型、动态内存管理及文件操作的学习和了解,通讯录的文章到这里就结束了谢谢支持 如这篇博客对大家有帮助的话希望 三连 支持一下 如果有错误感谢大佬的斧正 如有 其他见解发到评论区一起学习 一起进步。