这两天把动态内存还有文件函数这部分的课听了一下,也跟着把通讯录升级了一下
存储元素不再是固定的了,当存储的元素等于上限时内存就动态增长
每次退出信息又会销毁,可以用fwrite 和 fread让它保存到文件中,不过每次fwrite它就会覆盖之前的内容,所以每次初始化的时候都要先读取出来,等退出了再一次性读取写入文件中,数量多的话速度就会慢,想实现一下,今晚就下了个MySQL,听听网课琢磨琢磨
把这个改进版记录下来

int main()
{srand((unsigned int)time(NULL));game();return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>#define MAX_NAME 16
#define MAX_SAT 6
#define MAX_TELE 12
#define MAX_ADDR 15
//#define MAX 100
#define DEFAULT_SZ 3

定义在头文件的函数声明
各个的作用都写下来了


void game();
void menu();//菜单
void chushihua(struct uct* p1);
void addformation(struct uct* p1);//增加信息
void showformation(struct uct* p1);//显示信息
void subformation(struct uct* p1);//删除信息
void searchformation(const struct uct* p1);//查找信息
void modifyformation(struct uct* p1);//改动信息
int cmp_stu_name(const void* p1, const void* p2);//比较结构体内的姓名
void IncreasetCapacity(struct uct*p1);//检测存储是否满了
void realise(struct uct* p1);//释放动态内存
void savecontact(struct uct* p1);//保存信息
void loadcontact(struct uct* p1);//从文件中读取信息enum arr
{EXIT,ADD,SUB,SEARCH,MODIFY,SHOW,SORT,SAVE
};
struct information
{char name[MAX_NAME];int age;char set[MAX_SAT];char tele[MAX_TELE];char addr[MAX_ADDR];
};
struct uct
{struct information *data;int size;int capacity;
};

我一般喜欢函数从上往下实现

void menu()
{printf("*******************************\n");printf("*****1 add           2 sub*****\n");printf("*****3 search        4 modify**\n");printf("*****5 show          6 sort****\n");printf("*****7 save          0 exit****\n");printf("*******************************\n");
}
void IncreasetCapacity(struct uct* p1);//动态增加信息void loadcontact(struct uct* p1)
{struct information tmp = { 0 };FILE* pfRead = fopen("test.dat", "rb");//从文件中读取if (pfRead == NULL)//读取失败就返回{printf("loadcontact::%s", strerror(errno));return;}while (fread(&tmp, sizeof(struct information), 1, pfRead))//读取返回值为零说明没有元素此时循环停止{IncreasetCapacity(p1);//动态增加信息,判断是否需要增容p1->data[p1->size] = tmp;//从文件中读取信息放到临时结构体tmp中,再放到信息结构体中p1->size++;//元素作为data下标同时增长}fclose(pfRead);pfRead = NULL;
}
void chushihua(struct uct* p1)//初始化动态信息
{//memset(p1->data, 0, sizeof(p1->data));p1->data = (struct information*)malloc(DEFAULT_SZ * sizeof(struct information));if (p1->data == NULL)return;p1->size = 0;p1->capacity = DEFAULT_SZ;loadcontact(p1);}
void savecontact(struct uct* p1)//将结构体中的信息放到创建的文件中
{FILE* pfWrite = fopen("test.dat","wb");//创建一个dat文件,wb只写if (p1 == NULL){printf("%s\n",strerror(errno));return;}int i = 0;for (i = 0; i < p1->size; ++i)//有多少元素就写多少个,一次写一个{fwrite(&(p1->data[i]), sizeof(struct information), 1, pfWrite);}fclose(pfWrite);//关闭文件pfWrite = NULL;printf("信息保存成功\n");
}
void IncreasetCapacity(struct uct* p1)//动态增加信息
{if (p1->capacity == p1->size){p1->capacity += 2;struct information* ptr = (struct information*)realloc(p1->data, p1->capacity * sizeof(struct information));//如果结构体中的元素超过上限,realloc增加空间if (ptr != NULL){p1->data = ptr;printf("增容成功!\n");}elseprintf("增容失败!\n");}}void addformation(struct uct* p1)
{//检查空间是否满了,如果满了就动态增加//如果没满就啥也不干IncreasetCapacity(p1);printf("请添加信息\n");printf("请输入名字 -> \n");scanf("%s", p1 ->data[p1->size].name);printf("请输入年龄 -> \n");scanf("%d",&(p1 ->data[p1->size].age));printf("请输入性别 -> \n");scanf("%s", p1 ->data[p1->size].set);printf("请输入电话 -> \n");scanf("%s", p1 ->data[p1->size].tele);printf("请输入地址 -> \n");scanf("%s", p1 ->data[p1->size].addr);printf(" 添加成功 !\n");p1->size++;
}
void showformation(struct uct* p1)
{int i = 0;if (p1->size == 0){printf("内容为空\n");}else//如果不为0就打印信息{printf("%-16s\t%-3s\t%-6s\t%-12s\t%-15s\n","姓名","年龄","性别","电话","地址");for (i = 0; i < p1->size; ++i){printf("%-16s\t%-3d\t%-5s\t%-12s\t%-15s\n", p1->data[i].name,p1->data[i].age,p1->data[i].set,p1->data[i].tele,p1->data[i].addr);}}
}
static int sertch(const struct uct* p1,char name[MAX_NAME])
{int i = 0;for (i = 0; i < p1->size; ++i){if (0 == strcmp(p1->data[i].name, name))return i;}return -1;
}
void subformation(struct uct* p1)
{char name[MAX_NAME];printf("请输入要删除人的名字");scanf("%s", name);int ret = sertch(p1,name);if (ret == -1)printf("该联系人不存在!\n\n");else{while (ret < p1->size - 1){p1->data[ret] = p1->data[ret + 1];++ret;}p1->size--;printf("删除成功!\n\n");}
}
void searchformation(const struct uct* p1)
{char name[MAX_NAME];printf("请输入你要查找人的姓名:");scanf("%s", name);int i = sertch(p1, name);if (i == -1)printf("未查找到该联系人\n");else{printf("%-16s\t %-3s\t %-6s\t %-12s\t %-15s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%-16s\t%-3d\t%-5s\t%-12s\t%-15s\n", p1->data[i].name,p1->data[i].age,p1->data[i].set,p1->data[i].tele,p1->data[i].addr);}
}
void modifyformation(struct uct* p1)
{char name[MAX_NAME];printf("请输入要修改人的信息:");scanf("%s", name);int ret = sertch(p1, name);if (ret == -1){printf("未找到该联系人\n");}else{printf("请添加信息\n");printf("请输入名字 -> \n");scanf("%s", p1->data[ret].name);printf("请输入年龄 -> \n");scanf("%d", &(p1->data[ret].age));printf("请输入性别 -> \n");scanf("%s", p1->data[ret].set);printf("请输入电话 -> \n");scanf("%s", p1->data[ret].tele);printf("请输入地址 -> \n");scanf("%s", p1->data[ret].addr);printf(" xiugai成功 !\n");}
}int cmp_stu_name(const void* p1,const void* p2)//判断结构体中的名字顺序
{//return strcmp(((struct information*)p1)->name, ((struct information*)p2)->name);return strcmp(((struct information*)p1)->name,((struct information*)p2)->name);
}
void realise(struct uct* p1)//释放空间
{free(p1->data);p1->data = NULL;
}
void game()
{int input = 0;struct uct s1;chushihua(&s1);do{menu();printf("\n");printf("\n");printf("please input a number:");scanf_s("%d", &input);int sz = s1.size;switch (input){case ADD:addformation(&s1);//增break;case SUB:subformation(&s1);//删break;case SEARCH:searchformation(&s1);//查break;case MODIFY:modifyformation(&s1);//改break;case SHOW:showformation(&s1);//显示break;case SORT://排序qsort(s1.data, sz, sizeof(s1.data[0]),cmp_stu_name);break;case SAVE://保存savecontact(&s1);break;case EXIT://退出savecontact(&s1);realise(&s1);//退出之前释放动态空间printf("退出 \n");break;default :printf("输入错误!\n");break;}} while (input);
}

明天把扫雷记录下来吧,有一个地方偏偏不信那个邪就认为自己的那种方法可以实现,改了好多次一直有问题,不过也只是很次的方法,能用自己想的方法实现递归和记录估计会比听懂别人的方法写出来要开心更久☺

C语言实现通讯录(使用文件保存信息)相关推荐

  1. vs2010c语言通讯录读取,用C语言实现通讯录(二、动态版+文件保存信息)

    之前写的静态版的通讯录,只能存储固定数目大小的联系人信息,现在要升级为动态版的,这样只要容量不够的话只需自动扩容就可以啦!而且之前版本的信息每次退出程序后不会保存,每次需要重新录入,加入文件操作后可以 ...

  2. C语言实现动态通讯录(附带文件保存)

    ✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!!

  3. 【C语言】通讯录(文件版)

    这里写目录标题 一.通讯录说明 二.效果展示 三.代码展示 一.通讯录说明 通讯录拥有增.删.查.改等功能. 本文主要介绍通讯录文件版本,以动态版本的方式开辟空间. 文件版本功能:通讯录退出后,之前保 ...

  4. C# 读写ini文件 保存信息

    /// <summary> /// 获取本地信息 /// </summary> /// <returns></returns> private List ...

  5. c语言管理系统信息以文件保存,求大神给一份能用的c语言的学籍管理系统:且能进行文件保存...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #pragma comment(lib,"libmysql.lib") void showmenu ...

  6. 实现用户注册功能---文件保存信息,如果用户名存在就死循环继续

    # 一.实现用户注册功能# 思路:# 用户输入用户名.密码# 将用户输入的内容按照固定的格式,比如:egon:123,存入文件# 可以往一个文件中重复注册新的用户名和密码 with open(r'Te ...

  7. 用C语言实现 静态通讯录+动态通讯录+文件实现“退出保存信息版本”(附上思路+项目展示+源代码)

    前言 : 在生活中我们经常会遇到通讯录的使用,比如存进一个新的联系人的信息,或者对其删除,修改,查找:那这些神奇的功能是如何实现的?我们不禁好奇.今天,这篇博文将教会大家实现一个静态的或者动态的通讯录 ...

  8. C语言实现通讯录(含文件保存)

    目录 1.测试结果 2.整体思路 3.结构体的定义 4.核心函数搭建 5.模块代码解读 (1).显示菜单 (2).初始化通讯录 (3).给通讯录增加容量 (4).增加联系人 (5).查找联系人 (6) ...

  9. 【240行拿下】基于C语言 实现通讯录管理系统 带文件保存及读取功能

    一 首言         学校布置的小作业希望对你有帮助,完整代码在文章结尾为方便阅读代码基本都有注释.代码是在满足老师要求下,尽量减少功能和代码方便同学理解的思想上完成的 (完成7个功能,功能性代码 ...

最新文章

  1. C++ 多线程:时间控制
  2. 14、四大组件--Service
  3. 文件系统损坏导致数据文件异常恢复----惜分飞
  4. java 反序列化漏洞简介
  5. 在使用python语言的open函数时,提示错误OSError: [Errno 22] Invalid argument: ‘文件路径’
  6. VTK:Texture之TexturedSphere
  7. Windows下PHP多线程扩展pthreads的安装
  8. DEBUG主要命令(转)
  9. window.open() 方法
  10. 关于SVN出现 svn working copy locked的原因及解决方法
  11. Hadoop 核心概念解析
  12. FRM-18108 FRM-10102错误解决
  13. python生成首尾相连的字符串
  14. 重磅发布 | 图像图形学发展年度报告【中国图象图形学报第6期综述专刊】
  15. 全国通用 专升本计算机基础(简答题背诵可用)
  16. 【视频】0基础趣学SEO,引爆流量,让客户主动找上门的躺赚神技
  17. ie登录显示登录到ftp服务器,Ie浏览器登录ftp服务器
  18. Linux系统安装与使用基础之第二篇熟悉Linux操作系统
  19. jvm参数调优_3_问题排查
  20. 华硕ASUS 笔记本 改WIN7 BIOS 设置详解

热门文章

  1. 计算机视觉Baseline网络串烧(AlexNet、NIN、VGG、GoogLeNet、Inception、ResNet、InceptionResNet、DenseNet、SENet、ResNeXt)
  2. CSS3--通过Animation实现简单的手指点击动画
  3. CSS3控制变量输出精灵图序列帧动画 frameAnime.css
  4. 淘宝开源代码检测工具!(附源码)
  5. Mac下查看已安装的jdk版本及其安装目录
  6. 华大单片机GPIO配置
  7. FPGA笔记:VHDL语言总结
  8. 一文搞懂AVB的使用
  9. Juniper SSG5--Fragmented traffic异常流量报错
  10. GJB6600-装备交互式电子技术手册