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]

[var1]

[var1]

[var1]

存储功能

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

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

  1. 文件分类服务器,云服务器 搭建 文件分类存储

    云服务器 搭建 文件分类存储 内容精选 换一换 本章节指导用户挂载已有数据的共享磁盘,只可以用作数据盘.您可以在磁盘列表中查看磁盘信息,磁盘信息符合以下条件,该磁盘支持挂载至云服务器用作数据盘.共享盘 ...

  2. 懒人的文件分类整理神器:归类所有文件素材

    大家在平常学习和办公时,可能电脑保存各种格式的文件会越来越多,比如图片.文档.压缩包.视频等等,如果不进行整理会显得特别乱,至于如何归类呢?下面一起来试试这个新的处理技巧. 所需工具 文件素材若干 操 ...

  3. r语言 回归分析 分类变量_R语言进阶之广义线性回归

    广义线性回归是一类常用的统计模型,在各个领域都有着广泛的应用.今天我会以逻辑回归和泊松回归为例,讲解如何在R语言中建立广义线性模型. 在R语言中我们通常使用glm()函数来构建广义线性模型,glm实际 ...

  4. r语言 回归分析 分类变量_R语言 | 回归分析(二)

    R语言 语言学与R语言的碰撞 Xu & Yang PhoneticSan 学习参考 Discovering Statistics Using R Statistics for Linguist ...

  5. r语言 回归分析 分类变量_R语言下的PSM分析分类变量处理与分析步骤

    最近学习了PSM,我选择了用R去跑PSM,在这过程中遇到了许多问题,最后也都一一解决了,写下这个也是希望大家在遇到相同问题的时候能够得到帮助和启发,别的应该不会遇到太难的问题了哈哈.最近我也没做什么, ...

  6. C语言十进制转换为二进制(附完整源码)

    C语言十进制转换为二进制 C语言十进制转换为二进制完整源码 C语言十进制转换为二进制完整源码 #include <stdio.h> #include <stdlib.h>#de ...

  7. C语言数据类型 / 变量类型 - C语言零基础入门教程

    目录 一.C 语言数据类型分类 二.C 语言整形 1.无符号整形(16 位系统) 2.有符号整形(16 位系统) 3.int 和 long 区别 4.超出取值范围的整形 三.C 语言浮点型 float ...

  8. python自动化整理计算机文件(一)文件分类

    在日常工作中操作计算机时会接触大量不同格式的文件,为方便检索文件,可以使用Python对其进行自动化整理,本文介绍如何通过python编程完成文件的自动分类,文件和文件夹的快速查找,重复文件的清理,图 ...

  9. r读取文件夹下的所有csv文件_[R语言]读取文件夹下所有子文件夹中的excel文件,并根据分类合并。...

    解决的问题:需要读取某个大文件夹下所有子文件夹中的excel文件,并汇总,汇总文件中需要包含的2部分的信息:1.该条数据来源于哪个子文件夹:2.该条数据来源于哪个excel文件.最终,按照子文件夹单独 ...

最新文章

  1. Android之记录并研究Volley框架中知识点
  2. HDU-1045-fire net
  3. c++ 10.跳转语句
  4. MySQL 对于千万级的大表要怎么优化?
  5. c语言三种循环语句,C语言三种循环语句的功能等价性
  6. MATLAB中文显示乱码如何解决
  7. fluent-bit 本地安装及配置
  8. 镁光c400-MTFDDAK064M固态硬盘更新固件
  9. 简单几步便可轻松制作思维导图,快来查收这份干货
  10. 当我真正开始爱自己,我才认识到,所有的痛苦和情感折磨,都...
  11. StarRocks 社区一周年:极速统一,感谢遇见!
  12. LaTeX设置图片左对齐
  13. 杭州旭航集团,申请纳斯达克IPO上市,募资9800万美元
  14. useCallback 的问题和隐患的解决方案 - 胡耀(字节跳动)
  15. Android Studio打不开,出现start failed的报错
  16. Mybatis-01-配置详解
  17. python金融应用的好书推荐卡_十大金融好书推荐
  18. ansys怎么合并体_ANSYS梁体组合连接计算方法的讨论
  19. Android 简单的内存管理器
  20. 【数字化】“网络效应”指南:13 种网络效应全解析,带你了解巨头成功的秘密

热门文章

  1. 每日一题 2020.05.11
  2. 记一次服务器执行MySQL耗时问题
  3. ACE总监侯圣文全面解析特训方法
  4. 深度评测丨GaussDB(for Redis)大Key操作的影响
  5. 顶会VLDB‘22论文解读:CAE-ENSEMBLE算法
  6. ECS实践案例丨逻辑卷的创建和扩容操作指导
  7. 一个编程指南还有这么多道道儿?
  8. 十八般武艺玩转GaussDB(DWS)性能调优:总体调优策略
  9. RDS关系型数据库 入门 01 创建关系型数据库实例【华为云分享】
  10. java filter注入_如何在Java Filter 中注入 Service