通讯录实现的功能
1、添加联系人 2、删除联系人
3、查找联系人 4、修改联系人
5、显示联系人 6、清空通讯录
7、按照姓名进行排序 8、退出程序
该通讯录将联系人的信息保存在文件中
在VS2013中打开文件直接创建,创建建的文件名字是contact.dat,操作步骤如下:


使用的文件操作函数如下:
fopen
函数原型为 FILE *fopen( const char *fname, const char *mode );
打开由fname(文件名)指定的文件并返回一个关联该文件的流.如果发生错误, fopen()返回NULL.
mode(方式)是用于决定文件的用途
fwrite:
函数原型为 size_t fwrite ( const void * buffer, size_t size, size_t count, FILE * stream );
从buffer(缓冲区)中, 写count个大小为size(大小)的对象到stream(流)指定的流.
返回值是已写的对象的数量.
fread:
函数原型为size_t fread( void *buffer, size_t size, size_t num, FILE *stream );
读取[num]个对象(每个对象大小为size(大小)指定的字节数),
并把它们替换到由buffer(缓冲区)指定的数组
数据来自给出的输入流.


完整代码:

头文件:Addersss.h

 #define _CRT_SECURE_NO_WARNINGS 1
#ifndef _ADDRESS_LIST_H_
#define _ADDRESS_LIST_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NAME_MAX 12
#define TEL_MAX 12
#define SEX_MAX 5
#define ADDR_MAX 20
#define INIT 4
#define SIZE 4
enum OP
{
EXIT, //退出
ADD, //添加
DEL,//删除
SEARCH, //查找
REVISE, //修改
DISPLAY, //打印
SORT, //排序
EMPTY //清空
};
typedef struct PerInfo
{
char name[NAME_MAX];//姓名
int age; // 年龄
char sex[SEX_MAX];//性别
char tel[TEL_MAX]; //电话
char address[ADDR_MAX];//地址
}PerInfo;
typedef struct Contact
{
PerInfo* data;//存储所有联系人的信息
int size;
int capacity;
}Contact, *Pcon;
void Add(Pcon Con); //添加联系人
void Delete(Pcon Con);//删除联系人
void Revise(Pcon Con);//修改联系人
void Search(Pcon Con);//查找联系人
void Display(Pcon Con);//打印联系人
void Init(Pcon Con);//初始化通讯录
void Save_Contact(Pcon Con); //存储联系人
void Load_Contact(Pcon Con);//加载联系人
void Empty(Pcon Con); //清空联系人
void Sort(Pcon Con);//对联系人进行排序
void Free(Pcon Con);//释放空间 #endif //_ADDRESS_LIST_H_

Contact.c

 #define _CRT_SECURE_NO_WARNINGS 1
#include"AddressList.h"
void judge_full(Pcon Con) //当实际联系人个数和初始化的容量相等时用realloc增容
{
if (Con->capacity == Con->size)
{
PerInfo* tmp = (PerInfo*)realloc(Con->data, (Con->capacity + SIZE)*sizeof(PerInfo));
if (tmp == NULL)
{
printf("out of memery\n");
exit(EXIT_FAILURE);
}
else
{
Con->data = tmp;
Con->capacity += SIZE;
}
}
}
int Find(Pcon Con, char* str) //查找联系人函数
{
for (int i = ; i < Con->size; i++)
{
if (strcmp(str, Con->data[i].name) == )
{
return i;
}
}
return -;//没有找到返回 -1
}
void Add(Pcon Con) //添加
{
judge_full(Con);
printf("请输入联系人的姓名 年龄 性别 电话号码,家庭住址\n");
scanf("%s%d%s%s%s", Con->data[Con->size].name,
&Con->data[Con->size].age,
Con->data[Con->size].sex,
Con->data[Con->size].tel,
Con->data[Con->size].address);
Con->size++;
printf("添加成功\n");
return;
}
void Delete(Pcon Con)//删除联系人
{
char input[NAME_MAX];
int i = ;
printf("请输入联系人姓名:\n");
scanf("%s", input);
int ret = Find(Con, input);
if (ret != -)
{
for (i = ret; i < Con->size; i++)
{
Con->data[i] = Con->data[i + ]; //将所要删除的元素后面的元素都往前移动 }
Con->size--;
}
else
{
printf("这个联系人不存在!\n");
}
}
void Revise(Pcon Con) //修改联系人
{
char input[NAME_MAX];
printf("请输入联系人姓名:\n");
scanf("%s", input);
int ret = Find(Con, input);
if (ret != -)
{
printf("请输入修改后联系人的姓名,性别,年龄,电话号码,家庭住址\n");
scanf("%s, %s, %d, %s, %s",
Con->data[ret].name,
Con->data[ret].sex,
Con->data[ret].age,
Con->data[ret].tel,
Con->data[ret].address);
printf("修改完成\n");
}
else
{
printf("该联系人不存在\n");
}
}
void Search(Pcon Con)
{
char input[NAME_MAX];
printf("请输入联系人姓名:\n");
scanf("%s", input);
int ret = Find(Con, input);
if (ret != -)
{
printf("%s,%s,%d,%s,%s\n",
Con->data[ret].name,
Con->data[ret].sex,
Con->data[ret].age,
Con->data[ret].tel,
Con->data[ret].address);
}
else
{
printf("该联系人不存在!\n");
}
}
void Display(Pcon Con)
{
int i = ;
while (i < Con->size)
{
printf("%s,%s,%d,%s,%s\n",
Con->data[i].name,
Con->data[i].sex,
Con->data[i].age,
Con->data[i].tel,
Con->data[i].address);
i++;
}
}
void Init(Pcon Con)
{
Con->data = (PerInfo*)malloc(SIZE*sizeof(PerInfo)); //开辟空间
if (Con->data == NULL)
{
printf("out of memory\n");
exit(EXIT_FAILURE);
}
Con->size = ;
Con->capacity = INIT;
Load_Contact(Con);
}
void Save_Contact(Pcon Con) //存储联系人
{
FILE* pfwrite = fopen("contact.dat", "w");
if (pfwrite == NULL)
{
perror("open file for write");
exit(EXIT_FAILURE);
}
for (int i = ; i < Con->size; i++)
{
fwrite(&(Con->data[i]), sizeof(PerInfo), , pfwrite);
}
fclose(pfwrite);
}
void Load_Contact(Pcon Con)//加载联系人
{
FILE* pfread = fopen("contact.dat", "r");
PerInfo tmp = { };
if (pfread == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
while (fread(&tmp, , sizeof(PerInfo), pfread))
{
judge_full(Con);
Con->data[Con->size] = tmp;
Con->size++;
}
}
void Empty(Pcon Con)//清空联系人
{
Con->size = ;
return;
}
void Sort(Pcon Con) //按照联系人姓名进行排序
{
int flag = ;
for (int i = ; i < Con->size - ; i++) //需要排n-1趟
{
int flag = ;
for (int j = ; j < Con->size - - i; j++) //每趟进行n-1-i次比较
{
if (strcmp(Con->data[j].name, Con->data[j + ].name)>) //按照升序进行排序
{
flag = ;
PerInfo tmp = Con->data[j];
Con->data[j] = Con->data[j + ];
Con->data[j + ] = tmp;
}
}
if (flag == )
{
break;
}
}
}
void Free(Pcon Con)
{
free(Con->data);
Con->data = NULL; }

Test.c

 #define _CRT_SECURE_NO_WARNINGS 1
#include"AddressList.h"
void Print()
{ printf("**********************************************************\n");
printf("*********1:添加联系人*****2:删除联系人********************\n");
printf("*********3:查找联系人***** 4 : 修改联系人********************\n");
printf("*********5:显示所有联系人***6:排序*************************\n");
printf("*********7:清空联系人********0:退出************************\n");
printf("**********************************************************\n");
}
int main()
{
Contact pcon;
Init(&pcon);
int input;
while ()
{
Print();
printf("选择一个操作:");
scanf("%d", &input);
switch (input)
{
case EXIT:
Save_Contact(&pcon);
Free(&pcon);
exit();
break;
case ADD:
Add(&pcon);
break;
case DEL:
Delete(&pcon);
break;
case SEARCH:
Search(&pcon);
break;
case REVISE:
Revise(&pcon);
break;
case SORT:
Sort(&pcon);
break;
case DISPLAY:
Display(&pcon);
break;
case EMPTY:
Empty(&pcon);
break;
default:
printf("选择错误,请重新选择:\n"); }
}
system("pause");
return ;
}

---恢复内容结束---

简单的通讯录(C语言实现)的更多相关文章

  1. Python初学者笔记(4)-简单的通讯录

    要求: 编写一个简单的通讯录 1.通讯录包含至少包含姓名.电话号码.电子邮箱:2.通讯录的信息能够保存在本地磁盘:3.通讯录查找特定人员的信息:4.通讯录能够修改特定人员的信息:5.通讯录能够删除特定 ...

  2. Redis:安装、配置、操作和简单代码实例(C语言Client端)

    Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...

  3. iOS学习之Object-C语言简单的通讯录管理系统

    用这几天学的OC的知识,写了一个实现简单功能的通讯录管理系统,在这里分享给大家: 通讯录管理系统 *  需求: 1.定义联系人类Contact.实例变量:姓名(拼音,首字母大写).性别.电话号码.住址 ...

  4. 【Android Demo】简单手机通讯录

    Android 系统给我们提供了访问通讯录的接口,通过接口获取通讯录信息.Adapter 与 View 的连接主要依靠 getView 这个方法返回我们需要的自定义 view. ListView 是 ...

  5. Swift 简单的通讯录

    Swift 通讯录实战 1.功能需求 整个项目由三个界面构成:首页面(全部联系人),添加联系人界面和联系人详情界面 整个项目使用纯代码编程 数据处理方面使用一个工具类,处理所有数据的增删改查. 首页由 ...

  6. 【C++ in Qt5】一个简单的通讯录程序,支持文件存取

    https://github.com/shalliestera/AddressBook 使用Qt5完成了一些之前用DevCpp很难做到的事,比如更简单地实现“从文件读取”和“保存到文件”的功能.之前我 ...

  7. JSON的简单介绍以及C语言的JSON库使用

    JSON概述 JSON: JavaScript 对象表示法( JavaScript Object Notation) .是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采 ...

  8. php简单实现通讯录采集,我的第一个php,适合新手

    起源于要整理通讯录,原先用的是文件调查,现在学了php,就自己试一下.程序短小精悍,适于学习.有两个文件,bj.html用于显示和采集表单信息.bj.php用于处理数据和反馈结果.突出之处在于可以上传 ...

  9. Android程序设计-简单手机通讯录

    在微信中,手机QQ中你会发现软件读取手机通讯录这个功能,这个功能使得软件更好的与手机联系人绑定,从而达到分享,拨打电话,读取用户信息等操作.下面我们将通过一个demo实现这个功能 首先我们看一下效果图 ...

随机推荐

  1. Android EventBus现实 听说你out该

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/40794879.本文出自:[张鸿洋的博客] 1.概述 近期大家面试说常常被问到Ev ...

  2. MongoDB的C#驱动

    MongoDB的C#驱动基本使用 MongoDB的官方C#驱动可以通过这个链接得到.链接提供了.msi和.zip两种方式获取驱动dll文件. 通过这篇文章来介绍C#驱动的基本数据库连接,增删改查操作. ...

  3. UpdateModel方法

    WebForm 对 MVC 说:能否借你的UpdateModel方法来用用? 背景 ASP.NET MVC的Controller有个很不错的方法:UpdataModel (相对应的还有TryUpdat ...

  4. .Net下简单地实现MD5加密

    在.Net中为我们提供了一个方法HashPasswordForStoringInConfigFile,可以简单方便地实现MD5加密.该方法位于System.Web命名空间下,所以需要在引用中添加Sys ...

  5. 【转】Android学习系列–App离线下载功能实现

    原文:http://www.cnblogs.com/qianxudetianxia/archive/2011/07/20/2108965.html 宜未雨而绸缪,毋临渴而掘井.----朱用纯<治 ...

  6. 【AngularJS】 2.0 版本发布

    [AngularJS] 2.0 版本发布 w5cValidator[AngularJS] 2.0 版本发布   w5cValidator 插件基于angular原有的表单验证,在原有的基础上扩展了一些 ...

  7. bootstrap弹出框

    要想使用Bootstrap Popover(弹出框)则必须引入其依赖的文件: jquery.js这个必须的(还是要写在其他js前面,bootstrap是依赖jquery的哦) bootstrap-to ...

  8. Python日期操作

    1. 日期输出格式化 所有日期.时间的api都在datetime模块内. 1. datetime => string now = datetime.datetime.now() now.strf ...

  9. Cracking the Coding Interview(Stacks and Queues)

    Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to impl ...

  10. RTB撕开黑盒子 Part 3: Beyond Surplus

    在本文中,我将解释如果要对整个推广计划最大化利润,决定是否应该出价的应该是期望回本率(ROI),而不是期望利润,这与我们以前介绍的有所不同.在Datacratic,我们已经在2012年底切到了基于RO ...