c语言文件分类二进制,C语言实现文件版(二进制文件版)通讯录

本文详细介绍了如何使用C语言实现一个二进制文件版的通讯录,包括添加、删除、搜索、修改和存储功能。通过柔性数组和文件I/O操作,展示了如何管理个人信息并持久化存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言实现文件版(二进制文件版)通讯录

C语言实现文件版(二进制文件版)通讯录

通讯录功能

添加,删除,查找,修改, 全部,

储存

文章目录通讯录功能

文件结构

一、主函数文件(入口)

二、函数声明文件

三,函数的实现

功能测试添加

删除功能

查询功能

修改功能

存储功能

文件结构

头文件,函数文件,函数头文件。目录结构

提示:以下是本篇文章正文内容,下面案例可供参考

一、主函数文件(入口)

代码如下

#include "Contact.h"

void menu() {

printf("1.Add 2.Del\n");

printf("3.Search 4.Modeify\n");

printf("5.Show 6.Sort\n");

printf(" 7.存储 \n");

printf(" 0.exit \n ");

}

int main() {

int input = 0;

//创建通讯录

//struct Contact con;//包含1000个元素数组

//使用柔性数组版本

struct Contact con;//包含data指针和size和capacity

//初始化通讯录

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:

break;

case Save:

SaveContact(&con);

break;

case 0:

break;

SaveContact(&con);

//释放动态空间

Destry(&con);

printf("退出");

default:

printf("选择错误");

}

} while (input);

return 0;

}

二、函数声明文件

#include

#include

#include

#include

//#define Max 1000

#define Namesize 20

#define Sexsize 5

#define TeleSize 5

#define AddrSize 12

#define Def 3

//个人信息

typedef struct PeoInfo{

char name[Namesize];

int age;

char sex[Sexsize];

char tele[TeleSize];

char addr[AddrSize];

}PeoInfo;

//枚举选项

enum option{

EXIT,//0

ADD,//1

DEL,//2

SEARCH,//3

MODIFY,//4

SHOW,

SORT,

Save

};

//通讯录类型

typedef struct Contact

{

//struct PeoInfo data[Max];//存放1000个信息;->1000个 struct PeoInfo 这样的数据类型

//int size;记录已经有多少人信息

//使用柔性数组

struct PeoInfo* data;//存放1000个信息;->1000个 struct PeoInfo 这样的数据类型

int size;记录已经有多少人信息

int capacity;//记录当前通讯最大容量

}Contact;

//声明函数

void InitContact(struct Contact* ps);

void AddContact(struct Contact* ps);

//删除

void DelContact( struct Contact* ps);

void ShowContact(const struct Contact* ps);

void SearchContact(const struct Contact* ps);

void ModifyContact(struct Contact* ps);

void Destry(struct Contact* ps);

//保存

void SaveContact(struct Contact* ps);

//加载文件

void Loding(struct Contact* ps);

三,函数的实现

#include "Contact.h"

//函数实现

//检查容量代码CheckCapacity

void CheckCapacity(struct Contact* ps)

{

if (ps->size==ps->capacity)

{

//增加空间

struct PeoInfo*ptr=realloc(ps->data, (ps->capacity + 2) * sizeof(struct PeoInfo));

if (ptr != NULL)

{

ps->data = ptr;

ps->capacity += 2;

printf("增加空间成功");

}

else

{

printf("增加失败");

}

}

}

void InitContact(struct Contact* ps)

{

//memset(ps->data, 0, sizeof(ps->data));

//ps->size = 0;//设置通讯录初始化0个元素

ps->data = (struct PeoInfo*)malloc(Def * sizeof(struct PeoInfo));//开辟一个3*Peinfo这样的结构体类型

if (ps->data==NULL)

{

//申请空间失败

return;

}

ps->size = 0;

ps->capacity = Def;

Loding(ps);//将文件添加到到数据里

//

}

void CheckCapacity(struct Contact* ps);

void Loding(Contact* ps)

{

PeoInfo tmp = { 0 };

FILE* pfRead = fopen("contat.dat", "rb");

if (pfRead == NULL){

printf("LoadContact::%s\n", strerror(errno));

return;

}

//读取文件,存放到通讯录中

while (fread(&tmp, sizeof(PeoInfo), 1, pfRead))

{

CheckCapacity(ps);

ps->data[ps->size] = tmp;

ps->size++;

}

fclose(pfRead);

pfRead = NULL;

}

void AddContact(struct Contact* ps)

{

//if (ps->size == Max)

//{

//printf("通讯录已经满!");

//}

//else

//{

//printf("请输入名字>>");

//scanf("%s", ps->data[ps->size].name);//ps->size下标

//printf("请输入年龄>>");

//scanf("%d", &(ps->data[ps->size].age));//age不是一个数组需要取地址操作

//printf("请输入性别>>");

//scanf("%s", ps->data[ps->size].sex);

//printf("请输入电话>>");

//scanf("%s", ps->data[ps->size].tele);

//printf("请输入地址>>");

//scanf("%s", ps->data[ps->size].addr);

//ps->size++;

//printf("添加成功\n");

//}

//检测当前通讯录的容量

//如果满了,就增加空间

CheckCapacity(ps);

//增加数据

printf("请输入名字>>");

scanf("%s", ps->data[ps->size].name);//ps->size下标

printf("请输入年龄>>");

scanf("%d", &(ps->data[ps->size].age));//age不是一个数组需要取地址操作

printf("请输入性别>>");

scanf("%s", ps->data[ps->size].sex);

printf("请输入电话>>");

scanf("%s", ps->data[ps->size].tele);

printf("请输入地址>>");

scanf("%s", ps->data[ps->size].addr);

ps->size++;

printf("添加成功\n");

}

void ShowContact(const struct Contact* ps)

{

if (ps->size == 0)

{

printf("通讯录为空格\n");

}

else

{

int i = 0;

//% -20s对齐

printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");

for (i = 0; i < ps->size; i++) {

printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",

ps->data[i].name,

ps->data[i].age,

ps->data[i].sex,

ps->data[i].tele,

ps->data[i].addr);

}

}

}

// static(私有)

static int FindbyName(const struct Contact* ps, char name[Namesize])

{

int i = 0;

for (i = 0; i < ps->size; i++) {

if (0 == strcmp(ps->data[i].name, name))

{

return i;

}

}

return -1;

}

void DelContact( struct Contact* ps)

{

char name[Namesize];

int ret = 0;

printf("请输入要删除人的名字:>");

scanf("%s", name);

//1.查找要删除的人在什么位置

//找到了返回名字元素所在元素下标

//找不到返回-1

ret=FindbyName(ps,name);//查找名字函数

//2.删除

if (ret ==-1)

{

printf("要删除的人不存\n");

}

else

{

//删除数据

int j = 0;

for (j = ret; j < ps->size - 1; j++)

{

ps->data[j] = ps->data[j + 1];

}

ps->size--;

printf("删除成功\n");

}

}

void SearchContact(const struct Contact* ps)

{

int ret = 0;

char name[Namesize];

printf("请输入要查找人的名字:>");

scanf("%s", name);

ret = FindbyName(ps, name);

if (ret == -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->data[ret].name,

ps->data[ret].age,

ps->data[ret].sex,

ps->data[ret].tele,

ps->data[ret].addr);

}

}

void ModifyContact(struct Contact* ps)

{

int ret = 0;

char name[Namesize];

printf("请输入要修改的名字:>");

scanf("%s", name);

ret = FindbyName(ps, name);

if (ret == -1)

{

printf("要修改的人不存在\n");

}

else

{

printf("开始修改操作>>");

printf("请输入名字>>");

scanf("%s", ps->data[ret].name);//ps->size下标

printf("请输入年龄>>");

scanf("%d", &(ps->data[ret].age));//age不是一个数组需要取地址操作

printf("请输入性别>>");

scanf("%s", ps->data[ret].sex);

printf("请输入电话>>");

scanf("%s", ps->data[ret].tele);

printf("请输入地址>>");

scanf("%s", ps->data[ret].addr);

printf("修改成功\n");

}

}

void Destry(struct Contact* ps)

{

free(ps->data);

ps->data = NULL;

}

void SaveContact(struct Contact* ps)

{

FILE* pfWrite = fopen("contat.dat", "wb");

if (pfWrite == NULL)

{

printf("SaveContact::%s\n", strerror(errno));

return;

}

//写通讯录中数据到为文件中

int i = 0;

for (i = 0; i < ps->size; i++)

{

fwrite(&(ps->data[i]),sizeof(PeoInfo), 1, pfWrite);

}

fclose(pfWrite);

pfWrite = NULL;

}

功能测试

[var1]

f783a7f402b7506c6b3f968487c85bde.png

3495293ee227bf7cf5f2f88bc8ef1c8d.png

[var1]

bb78a7e21964f2251256428b4bf226b8.png

[var1]

889f3f5dd846b15f657ea8c16e6a5dd3.png

[var1]

749b14c9dc6555c8eff1564362143eda.png

存储功能

0361005b8d2f03622fee81ddcf69d692.png

f6f09dfd50edf8d72fc8924b64310e2e.png

6167ee3eac9fccae2c8e479369a7514d.png

c97a837c268b52c06db89fedc22cbdad.png

C语言实现文件版(二进制文件版)通讯录相关教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值