通讯录管理文件升级版怎么下载,修改通讯录管理
Yyds干货库存
是的,它又来了,通讯录管理文件的升级版,已经是我们的第三个版本了。让我们考虑一下。前两个版本虽然没有问题,但是不能保存我们输入的信息,每次都要重新输入。今天的文件版本可以完美实现这个功能。我们这次升级的部分不多,只有几个部分。让我们看一看。
注意:本次升级涉及到文件操作的相关知识。如果你不了解文件操作,可以看我下一篇博客详细讲解文件操作。
1.fwrite文件写入函数和fread文件读取函数在解释通讯录之前,我们需要知道两个函数:fwrite文件写入函数和fread文件读取函数。请首先参考它们。
1.1演示fwrite函数。首先,我们创建一个结构S,然后给该结构赋值,并使用fopen打开文件test.txt。这里说明一下,因为我们写的是“wb”,所以test.txt文件不需要在文件夹里新建。只要在这里给出名称,系统就会自动创建,然后判断文件是否可以成功打开,避免打开失败和错误。然后我们使用fwrite函数。我们一次写入两条信息将结构中S中的信息写入pf指向的文件test.txt,最后关闭文件。
//以二进制形式编写文件
结构S
{
char name[20];
int age
双倍积分;
};
int main()
{
struct S[2]={ { 张三,20,55.6},{ 李四,18,99.9 } };
FILE* pf=fopen(test.txt , WB );
if (pf==NULL)
{
返回0;
}
//以二进制形式编写文件
fwrite( s,sizeof(struct S),2,pf);
fclose(pf);
pf=NULL
返回0;
}1.2说明fread函数的文件读取操作,创建一个与文件写入结构一致的结构tmp来存储读取的信息。“rb”和“wb”不一样。请注意不同之处。“rb”读取test.txt中的数据,fread函数将pf指向的test.txt中的数据读入tmp,然后打印出来。
结构S
{
char name[20];
int age
双倍积分;
};
int main()
{
//struct S s={ 张三,20,55.6 };
struct S tmp[2]={ 0 };
FILE* pf=fopen(test.txt , Rb );
if (pf==NULL)
{
返回0;
}
//以二进制形式读取文件
fread( tmp,sizeof(struct S),2,pf);
printf(%s %d %lf\n ,tmp[0]。名称,tmp[0]。年龄,tmp[0]。分数);
printf(%s %d %lf\n ,tmp[1]。名称,tmp[1]。年龄,tmp[1]。分数);
fclose(pf);
pf=NULL
返回0;
}2.将信息写入文件并添加保存功能。首先,使用fopen将pfwrite指向contact.txt文件并打开它。(随便写contact.txt的文件名),判断打开是否成功。如果打开失败,printf(%s\n ,strerror(errno));提示打开失败消息。注意,strerror打印错误代码函数,而(errno)是错误代码变量。这里不是重点(strerror需要引用头文件# includerrno.h)。我会放在文件操作博客里详细讲解,然后用fwrite函数把通讯录里的数据写入pfwrite指向的contact.txt文件,一次一个。
voids avecontact(struct contact * PS)//保存到文件函数
{
FILE * pf write=fopen( contact . txt , WB );
if (pfwrite==NULL)
{
printf(%s\n ,strerror(errno));
返回;
}
//将通讯簿中的数据写入文件。
int I=0;
for(I=0;I PS-size;我)
{
fwrite( (ps- data[i]),sizeof(struct peoinfo),1,pf write);
}
Printf(成功保存\ n );
fclose(pf write);
pfwrite=NULL
}3.从文件中读取地址簿。我们现在只是把数据写入文件,但还没有显示出来。这需要fread函数。我们来分析一下代码,因为每次打开通讯录都会初始化,所以我们会在通讯录初始化的时候将数据读入通讯录,并写一个loadcontact函数(函数:将文件中已经存储的文件信息加载到通讯录中)。同样,打开pfread指向的文件contact.txt,注意“rb”。哦,我们创建一个新的struct peoinfo结构tmp,用来存放读取的数据,然后判断这个loadcontact:%s\n,没有任何意义,只是对错误的位置做一个具体的提醒,根据习惯可以添加也可以不添加,然后开始我们真正的文件读取操作。将pfread指向的contact.txt文件中的数据读入tmp,一次一个。fread函数有一个返回值。详情见图。
在这个问题中,我们一次读取一个数据,最后当我们读完它时,我们将返回0。我们使用while循环读取数据,数据被读取,但不在tmp中的通讯录中。还有一个问题,就是通讯录有没有容量把这些数据放下来,我们还要再检查一下容量。如果不够,我们需要增加容量。只需在加载信息loadcontact之前放入容量增加函数cheakcontact,然后将信息放入下标size的数据元素中即可。
void init contact(struct contact * PS)//地址簿初始化函数
{
PS-data=(struct peo info *)malloc(default _ SZ * sizeof(struct peo info));
if (ps- data==NULL)
{
返回;
}
PS-size=0;
PS-capacity=default _ SZ;
//将文件中已经存储的文件信息加载到通讯录中
load contact(PS);
}
void cheak capacity(struct contact * PS);//声明容量增加函数
void load contact(struct contact * PS)//将文件信息加载到地址簿的函数
{
struct peo info tmp={ 0 };
FILE* pfread=fopen(contact.txt , Rb );
if (pfread==NULL)
{
printf(loadcontact:%s\n ,strerror(errno));
返回;
}
//读取文件并存储在通讯簿中。
While (fread ((tmp),sizeof (structpeo info),1,pfread))//fread的返回值是它实际读取的数据的个数。
{
cheak capacity(PS);//检查容量是否足够。
PS-data[PS-size]=tmp;//将信息放在带有下标大小的数据元素上
PS-size;
}
fclose(pfread);
pfread=NULL
}效果显示
4.提示其实我们还可以在exit函数out中加入savecontact( con) save函数,这样更方便。
案例分析:
//销毁通讯录:释放动态打开的空间。
save contact(con);
destroy contact(con);
Printf(退出通讯簿\ n );
打破;5.请留言。如果你还不了解你的朋友,可以私信评论我。如果喜欢,请喜欢收藏,支持收藏。
6.完整的代码课程-22 . c # define _ CRT _ secure _ no _ warnings 1
#包含stdio.h
#包含字符串. h
#包含“contact.h”
//通讯簿实现
无效菜单()
{
printf( * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n );
printf( * * * * * * 1 . add 2 . del * * * * * \ n );
printf( * * * * * * 3 . search 4 . modify * * * * * \ n );
printf( * * * * * * 5 . show 6 . sort * * * * * \ n );
printf( * * * * * * 7 . save 0 . out * * * * * \ n );
printf( * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n );
}
int main()
{
int input=0;
//创建通讯簿
结构接触孔;//通讯录,包括:数据指针大小,容量
//初始化通讯簿
init contact(con);
做
{
menu();
Printf(请选择:);
scanf(%d ,输入);
开关(输入)
{
案例添加:
add contact(con);//添加消息
打破;
案例编号:
del contact(con);//删除信息
打破;
案例搜索:
search contact(con);//查找信息
打破;
案例修改:
modify contact(con);//修改信息
打破;
案例展示:
show contact(con);//打印通讯簿
打破;
案例排序:
sort contact(con);//对通讯簿进行排序
打破;
案例分析:
//销毁通讯录:释放动态打开的空间。
save contact(con);
destroy contact(con);
Printf(退出通讯簿\ n );
打破;
案例保存:
save contact(con);
打破;
默认值:
Printf(选择错误,请重新选择\ n );
打破;
}
} while(输入);
返回0;
} contact . h # define _ CRT _ SECURE _ NO _ WARNINGS 1
//#定义最大1000
#定义默认值_sz 3
#定义MAX_NAME 20
#定义MAX_SEX 5
#定义MAX_TELE 12
#定义马克斯_ADDR 30
#包含标准库
#包含错误号h
枚举选项//枚举,用于替换开关盒语句中的0 1 2 3 ,增强代码的可读性
{
出去,
添加,
德尔,
搜索,
修改,
秀,
排序,
救援
};
结构peoinfo
{
char NAME[MAX _ NAME];
年龄
char SEX[MAX _ SEX];
char TELE[MAX _ TELE];
char addr[MAX _ ADDR];
};
//通讯录类型
结构接触
{
结构peoinfo *数据;//存放信息
(同Internationalorganizations)国际组织大小;//记录当前已经有的元素个数
(同Internationalorganizations)国际组织容量;//当前通讯录的最大容量
};
//函数声明
void init contact(struct contact * PS);//初始化
void add contact(struct contact * PS);//增加一个信息
void show contact(const struct contact * PS);//打印通讯录中的信息
void del contact(struct contact * PS);//删除信息
void搜索contact(const struct contact * PS);//查找信息
void修改触点(struct contact * PS);//修改信息
void sort contact(struct contact * PS);//排序信息
void destroy contact(struct contact * PS);//销毁通讯录
void save contact(struct contact * PS);//保存到文件
空载荷接触(结构接触* PS);//加载文件中的信息到通讯录接触。c# define _ CRT _ SECURE _ NO _ WARNINGS 1
#包含"联系人. h "
#包含标准视频
#包含字符串。h
void initcontact(结构接触* ps)//通讯录初始化函数
{
PS-data=(struct peo info *)malloc(default _ SZ * size of(struct peo info));
if (ps- data==NULL)
{
返回;
}
PS-size=0;
PS-capacity=default _ SZ;
//把文件中已经存放的文件信息加载到通讯录中
负载触点(PS);
}
void cheak容量(结构触点* PS);//声明增容函数
无效负载接触(结构触点* ps)//将文件信息加载到通讯录中函数
{
结构peo信息tmp={ 0 };
FILE* pfread=fopen(contact.txt , Rb );
if (pfread==NULL)
{
printf(loadcontact:%s\n ,strerror(errno));
返回;
}
//读文件存放到通讯录中
while (fread( (tmp),sizeof(struct peoinfo),1,pfread))//fread的返回值是其真实读到的数据的个数
{
cheak容量(PS);//检查容量够不够,不够增容
PS-data[PS-size]=tmp;//把信息放入下标为大小的数据元素上
PS-size;
}
fclose(pfread);
pfread=NULL
}
void cheak容量(结构触点* PS)//增容函数
{
如果(ps大小==ps容量)
{
//给ps-数据增容,每次增2
struct peo info * ptr=realloc(PS-data,(PS-capacity 2)* sizeof(struct peo info));
如果(ptr!=NULL)//增容成功
{
PS-data=ptr;
ps-容量=2;//容量2
printf(增容成功\ n’);
}
其他
{
printf(增容失败\ n’);
}
}
}
void add contact(struct contact * PS)//增加函数
{
//检测通讯录容量
//1.如果满了增容
//2.没满啥也不干
cheak容量(PS);
//添加数据
printf(请输入名字:);
scanf(%s ,ps- data[ps- size].姓名);//将信息放入下标为大小的空间
printf(请输入年龄:);
scanf(%d ,(ps- data[ps- size]).年龄));
printf(请输入性别:);
scanf(%s ,ps- data[ps- size].性);
printf(请输入电话:);
scanf(%s ,ps- data[ps- size].tele);
printf(请输入地址:);
scanf(%s ,ps- data[ps- size].addr);
PS-size;
printf(添加成功\ n’);
//if (ps- size==MAX)
//{
//printf(通讯录以满,无法增加\ n’);
//}
//否则
//{
//printf(请输入名字:);
//scanf(%s ,ps- data[ps- size].姓名);//将信息放入下标为大小的空间
//printf(请输入年龄:);
//scanf(%d ,(ps- data[ps- size]).年龄));
//printf(请输入性别:);
//scanf(%s ,ps- data[ps- size].性);
//printf(请输入电话:);
//scanf(%s ,ps- data[ps- size].tele);
//printf(请输入地址:);
//scanf(%s ,ps- data[ps- size].addr);
//PS-size;
//printf(添加成功\ n’);
//}
}
void显示联系人(const struct contact * PS)//打印函数
{
如果(ps- size==0)
{
printf(通讯录为空\ n’);
}
其他
{
int I=0;
//打印标题
printf( %-20s \ t %-4s \ t %-5s \ t %-12s \ t %-20s \ n ,名字,年龄,性别,电话,地址);
//打印数据
for(I=0;I PS-size;我)
{
printf( %-20s \ t %-4d \ t %-5s \ t %-12s \ t %-20s \ n ,
ps- data[i].姓名,
ps- data[i].年龄,
ps- data[i].性,
ps- data[i].电话,
ps- data[i].addr);
}
}
}
static int find by NAME(const struct contact * PS,char name[MAX_NAME])//static修饰函数,使此函数今在本文件(联系人:c)中起作用
{
int I=0;
for(I=0;I PS-size;我)
{
if (strcmp(ps- data[i]).name,name)==0)
{
返回我;//找到返回下标
}
}
return-1;//没找到
}
无效delcontact(结构接触* ps)//删除函数
{
char NAME[MAX _ NAME];
printf(请输入要删除的人的姓名:);
scanf(%s ,名称);
//查找要删除的人在什么位置
int pos=findbyname(ps,name);//这里把查找名字写成一个函数,找到返回1,找不到返回-1
//删除
if (pos==-1)//没找到的情况
{
printf(要删除的人不存在\ n’);
}
其他
{
int j=0;
for(j=pos;j PS-size-1;j)
{
PS-data[j]=PS-data[j 1];
}
PS-size-;
printf(删除成功\ n’);
}
}
void搜索联系人(const struct contact * PS)//查找函数
{
char NAME[MAX _ NAME];
printf(请输入要查找人的姓名:);
scanf(%s ,名称);
int pos=findbyname(ps,name);
if (pos==-1) //没找到的情况
{
printf(要查找的人不存在\ n’);
}
else//找到了
{
printf( %-20s \ t %-4s \ t %-5s \ t %-12s \ t %-20s \ n ,名字, 年龄, 性别, 电话, 地址);//打印标题
printf( %-20s \ t %-4d \ t %-5s \ t %-12s \ t %-20s \ n ,
ps-数据[位置]。姓名,
ps-数据[位置]。年龄,
ps-数据[位置]。性,
ps-数据[位置]。电话,
ps-数据[位置]。addr);
}
}
void modifycontact(结构接触* ps)//修改函数
{
char NAME[MAX _ NAME];
printf(请输入要修改人的名字:);
scanf(%s ,名称);
int pos=findbyname(ps,name);
if (pos==-1)
{
printf(要修改人的信息不存在\ n’);
}
其他
{
printf(请输入名字:);
scanf(%s ,ps- data[pos].姓名);//将信息放入下标为刷卡机的空间
printf(请输入年龄:);
scanf(%d ,(ps- data[pos].年龄));
printf(请输入性别:);
scanf(%s ,ps- data[pos].性);
printf(请输入电话:);
scanf(%s ,ps- data[pos].tele);
printf(请输入地址:);
scanf(%s ,ps- data[pos].addr);
printf(修改成功\ n’);
}
}
int int_name(const void*e1,const void*e2)//比较函数
{
返回strcmp(((结构peo信息*)E1)-名称,((结构peo信息*)E2)-名称);
}
void sortcontact(结构接触* ps)//排序函数,用库函数编译器函数库自带的快速排序函数实现
{
如果(ps- size==0)
{
printf(通讯录中无联系人,不可排序\ n’);
}
其他
{
qsort(ps- data,ps- size,sizeof(ps- data[0]),int _ name);
printf(排序成功\ n’);
}
}
//void sort contact(struct contact * PS)//排序函数,冒泡排序
//{
//if (ps- size==0)
//{
//printf(通讯录中无联系人,不可排序\ n’);
//}
//否则
//{
//int I=0;
//for(I=0;I PS-size-1;i )//一趟
//{
//int j=0;
//for(j=0;j PS-size-1-j;j )//一趟交换次数
//{
//if (strcmp(ps- data[j]).名称ps- data[j 1].姓名)0)
//{
//struct peo info tmp=PS-data[j];
//PS-data[j]=PS-data[j 1];
//PS-data[j 1]=tmp;
//}
//}
//}
//printf(排序成功\ n’);
//}
//}
void destroycontact(结构接触* ps)//销毁通讯录函数
{
免费(PS-data);
PS-data=NULL;
}
void保存联系人(结构触点* ps)//保存到文件函数
{
FILE * pf write=fopen( contact。txt , WB );
if (pfwrite==NULL)
{
printf(%s\n ,strerror(errno));
返回;
}
//写通讯录中的数据到文件中
int I=0;
for(I=0;I PS-size;我)
{
fwrite( (ps- data[i]),sizeof(struct peoinfo),1,pf write);
}
printf(保存成功\ n’);
fclose(pf写);
pfwrite=NULL
}
评论0 发布评论
wx63413e8871069
2022-10-08 17:10
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。