本喵是FW的视频封面图第一版

宝子,你不点个赞吗?不评个论吗?不收个藏吗?

最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要。

目录

使用文件的原因

文件是什么

文件名

通讯录(文件操作化)

修改后的源码

保存数据

加载文件信息到通讯录

总结


使用文件的原因

我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数 据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯 录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。

我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。 这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据 库等方式。

使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。


文件是什么

磁盘上的文件是文件。

但是在程序设计中,我们一般谈的文件有两种:程序文件数据文件(从文件功能的角度来分类的)。

程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境 后缀为.exe)。

数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件, 或者输出内容的文件


文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。

文件名包含3部分:文件路径+文件名主干+文件后缀


通讯录(文件操作化)

修改后的源码

//Contact.c#define _CRT_SECURE_NO_WARNINGS 1#include#include#include"contact.h"//静态//void InitContact(Contact* pc)//{//assert(pc);//pc->sz = 0;//memset(pc->data, 0, sizeof(pc->data));//}void InitContact(Contact* pc){assert(pc);pc->sz = 0;PeoInfo* ptr = (PeoInfo*)calloc(sizeof(PeoInfo), DEFAULT_SZ);if (ptr == NULL){perror("InitContact::calloc");return;}pc->data = ptr;pc->capacity = DEFAULT_SZ;//加载文件信息到通讯录LoadContact(pc);}//void AddContact(Contact* pc)//{//assert(pc);//if (pc->sz == 1000)//{//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].addr);//printf("请输入电话:>");//scanf("%s", pc->data[pc->sz].tele);//pc->sz++;//}void check_capacity(Contact* pc){if (pc->sz == pc->capacity){//增加容量PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(PeoInfo));if (ptr == NULL){perror("check_capacity::realloc");return;}pc->data = ptr;pc->capacity += INC_SZ;printf("增容成功\n");}}void AddContact(Contact* pc){assert(pc);check_capacity(pc);if (pc->sz == pc->capacity){//增加容量}//增加一个人的信息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].addr);printf("请输入电话:>");scanf("%s", pc->data[pc->sz].tele);pc->sz++;}void ShowContact(const Contact* pc){assert(pc);int i = 0;printf("%-20s\t%-4s\t%-5s\t%-20s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话");for (i = 0; i sz; i++){printf("%-20s\t%-4d\t%-5s\t%-20s\t%-15s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele);}}int FindByName(const Contact* pc, char name[]){assert(pc);int i = 0;for (i = 0; i sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;}void DelContact(Contact* pc){assert(pc);char name[NAME_MAX] = { 0 };if (pc->sz == 0){printf("通讯录为空,无法删除");return;}//删除//找出要删除的人printf("请输入要删除的人的名字;>");scanf("%s", name);int ret = FindByName(pc, name);if (-1 == ret){printf("要删除的人不存在\n");return;}int i = 0;int del = 0;for (i = 0; i sz; i++){if (strcmp(pc->data[i].name, name) == 0){del = i;break;}}//删除for (i = del; i sz; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");}void SearchContact(const Contact* pc){assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要查找人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (-1 == pos){printf("要查找的人不存在\n");return;}//打印信息printf("%-20s\t%-4s\t%-5s\t%-20s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话");printf("%-20s\t%-4d\t%-5s\t%-20s\t%-15s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].addr, pc->data[pos].tele);}void ModifyContact(Contact* pc){assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要删除的人的名字;>");scanf("%s", name);int pos = FindByName(pc, name);if (-1 == pos){printf("要删除的人不存在\n");return;}printf("请输入名字:>");scanf("%s", pc->data[pos].name);printf("请输入年龄:>");scanf("%d", &(pc->data[pos].age));printf("请输入性别:>");scanf("%s", pc->data[pos].sex);printf("请输入地址:>");scanf("%s", pc->data[pos].addr);printf("请输入电话:>");scanf("%s", pc->data[pos].tele);printf("修改完成\n");}//排序函数//1.按照姓名进行排序int Conpare_ByName(const void* e1, const void* e2){return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);}//2.按照年龄进行排序int Conpare_ByAge(const void* e1, const void* e2){return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;}//3.按照住址进行排序int Conpare_ByAddress(const void* e1, const void* e2){return strcmp(((struct PeoInfo*)e1)->addr, ((struct PeoInfo*)e2)->addr);}void SortContact(Contact* pc){assert(pc);printf("请选择你想排序的方式:\n");printf("1.姓名\n2.年龄\n3.住址\n");int input = 0;scanf("%d", &input);switch (input){case 1:qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByName);printf("排序成功\n");break;case 2:qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByAge);printf("排序成功\n");break;case 3:qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByAddress);printf("排序成功\n");break;}}//void DeaContact(Contact* pc)//{//assert(pc);//memset(pc->data, 0, sizeof(pc->data));//pc->sz == 0;//printf("清空成功!\n");////}void DestoryContact(Contact* pc){free(pc->data);pc->data = NULL;pc->sz = 0;pc = NULL;}void SaveContact(Contact* pc){//写数据//打开文件FILE* pf = fopen("contact.txt", "wb");if (NULL == pf){perror("SaveContact");}else{int i = 0;for (i = 0; i sz; i++){fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);}fclose(pf);pf = NULL;printf("保存数据成功\n");}}void LoadContact(Contact* pc){//读数据//打开文件FILE*pf=fopen("contact.txt","rb");if (pf == NULL){perror(LoadContact);}else{//2.读数据PeoInfo tmp = { 0 };int i = 0;while (fread(&tmp, sizeof(PeoInfo), 1, pf)){//增容check_capacity(pc);pc->data[i] = tmp;pc->sz++;i++;}fclose(pf);pf = NULL;}}
//teat.c#define _CRT_SECURE_NO_WARNINGS 1#include#include"contact.h"void menu(){printf("*********************************\n");printf("***** 1.add 2.del******\n");printf("***** 3.search4.modify ******\n");printf("***** 5.show6.sort ******\n");printf("***** 7.dea 0.exit ******\n");printf("*********************************\n");}int main(){int input = 0;//ͨѶ¼PeoInfodata[1000];int sz = 05l;Contact con;InitContact(&con);do{menu();printf("请输入->");scanf("%d", &input);switch (input){case1:AddContact(&con);break;case2:DelContact(&con);break;case3:SearchContact(&con);break;case4:ModifyContact(&con);break;case5:ShowContact(&con);break;case6:SortContact(&con);break;case7:/*DeaContact(&con);*/DestoryContact(&con);break;case0://先保存数据SaveContact(&con);DestoryContact(&con);printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);return 0;}
//Contact.h#pragma once#define MAX 1000#define NAME_MAX 20#define SEX_MAX 5#define ADDR_MAX 30#define TELE_MAX 12#include#include#include#include#define DEFAULT_SZ 3//默认大小#define INC_SZ 2//人的信息typedef struct PeoInfo{char name[NAME_MAX];int age;char sex[SEX_MAX];char addr[ADDR_MAX];char tele[TELE_MAX];}PeoInfo;struct contact{struct PeoInfo data[NAME_MAX];int sz;//记录当前已经有的元素个数};//静态//typedef struct Contact//{//PeoInfo data[1000];//存放人的信息//int sz;//当前已存放信息的个数//}Contact;//动态 typedef struct Contact{PeoInfo* data;//指向存放人的信息int sz;//当前已存放信息的个数intcapacity;//当前通讯录最大容量}Contact;//初始化通讯录void InitContact(Contact* pc);//销毁通讯录void DestoryContact(Contact* pc);删除所有联系人//void DeaContact(Contact* pc);//增加联系人void AddContact(Contact* pc);//删除指定联系人void DelContact(Contact* pc);//显示通讯录void ShowContact(const Contact* pc);//查找指定联系人void SearchContact(Contact* pc);//修改指定联系人void ModifyContact(Contact* pc);//联系人排序void SortContact(Contact* pc);//保存通讯录中的信息到文件中去void SaveContact(Contact* pc);//加载文件信息到通讯录void LoadContact(Contact* pc);

保存数据

记得头文件声明和test里引用哈!

void SaveContact(Contact* pc){//写数据//打开文件FILE* pf = fopen("contact.txt", "wb");if (NULL == pf){perror("SaveContact");}else{int i = 0;for (i = 0; i sz; i++){fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);}fclose(pf);pf = NULL;printf("保存数据成功\n");}}


加载文件信息到通讯录

void LoadContact(Contact* pc){//读数据//打开文件FILE*pf=fopen("contact.txt","rb");if (pf == NULL){perror(LoadContact);}else{//2.读数据PeoInfo tmp = { 0 };int i = 0;while (fread(&tmp, sizeof(PeoInfo), 1, pf)){//增容check_capacity(pc);pc->data[i] = tmp;pc->sz++;i++;}fclose(pf);pf = NULL;}}

总结

考完试,再复习时,重新更新,抱歉抱歉,罪过,罪过。

宝子,你不点个赞吗?不评个论吗?不收个藏吗?

最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要。