通讯录文件操作化
文件描述符
宝子,你不点个赞吗?不评个论吗?不收个藏吗?
链接库
最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!
安卓
喵喵喵,你对我真的很重要。
代码
网络规划
目录
模板变量
内容运营
进击的技术er
perl
typescript
关键点检测
春招
多端开发
软技能
使用文件的原因
我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数 据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯 录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。
window
我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。 这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据 库等方式。
链游脚本
使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
完整版用户管理系统
文件是什么
磁盘上的文件是文件。
C++基础知识
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
火车票查询系统
程序文件
教程
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境 后缀为.exe)。
电路
数据文件
DS18B20原理
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件, 或者输出内容的文件
获取签名中的SHA1的值
文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用。
满屏玫瑰
文件名包含3部分:文件路径+文件名主干+文件后缀
微信小程序下载
通讯录(文件操作化)
修改后的源码
//Contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#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 < pc->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 < pc->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 < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
del = i;
break;
}
}
//删除
for (i = del; i < pc->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 < pc->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<stdio.h>
#include"contact.h"
void menu()
{
printf("*********************************\n");
printf("***** 1.add 2.del ******\n");
printf("***** 3.search 4.modify ******\n");
printf("***** 5.show 6.sort ******\n");
printf("***** 7.dea 0.exit ******\n");
printf("*********************************\n");
}
int main()
{
int input = 0;
//ͨѶ¼
PeoInfo data[1000];
int sz = 05l;
Contact con;
InitContact(&con);
do
{
menu();
printf("请输入->");
scanf("%d", &input);
switch (input)
{
case 1:
AddContact(&con);
break;
case 2:
DelContact(&con);
break;
case 3:
SearchContact(&con);
break;
case 4:
ModifyContact(&con);
break;
case 5:
ShowContact(&con);
break;
case 6:
SortContact(&con);
break;
case 7:
/*DeaContact(&con);*/
DestoryContact(&con);
break;
case 0:
//先保存数据
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<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#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;//当前已存放信息的个数
int capacity;//当前通讯录最大容量
}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 < pc->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;
}
}
总结
考完试,再复习时,重新更新,抱歉抱歉,罪过,罪过。
宝子,你不点个赞吗?不评个论吗?不收个藏吗?
最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要。