简单的通讯录(C语言实现)
通讯录实现的功能
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语言实现)的更多相关文章
- Python初学者笔记(4)-简单的通讯录
要求: 编写一个简单的通讯录 1.通讯录包含至少包含姓名.电话号码.电子邮箱:2.通讯录的信息能够保存在本地磁盘:3.通讯录查找特定人员的信息:4.通讯录能够修改特定人员的信息:5.通讯录能够删除特定 ...
- Redis:安装、配置、操作和简单代码实例(C语言Client端)
Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...
- iOS学习之Object-C语言简单的通讯录管理系统
用这几天学的OC的知识,写了一个实现简单功能的通讯录管理系统,在这里分享给大家: 通讯录管理系统 * 需求: 1.定义联系人类Contact.实例变量:姓名(拼音,首字母大写).性别.电话号码.住址 ...
- 【Android Demo】简单手机通讯录
Android 系统给我们提供了访问通讯录的接口,通过接口获取通讯录信息.Adapter 与 View 的连接主要依靠 getView 这个方法返回我们需要的自定义 view. ListView 是 ...
- Swift 简单的通讯录
Swift 通讯录实战 1.功能需求 整个项目由三个界面构成:首页面(全部联系人),添加联系人界面和联系人详情界面 整个项目使用纯代码编程 数据处理方面使用一个工具类,处理所有数据的增删改查. 首页由 ...
- 【C++ in Qt5】一个简单的通讯录程序,支持文件存取
https://github.com/shalliestera/AddressBook 使用Qt5完成了一些之前用DevCpp很难做到的事,比如更简单地实现“从文件读取”和“保存到文件”的功能.之前我 ...
- JSON的简单介绍以及C语言的JSON库使用
JSON概述 JSON: JavaScript 对象表示法( JavaScript Object Notation) .是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采 ...
- php简单实现通讯录采集,我的第一个php,适合新手
起源于要整理通讯录,原先用的是文件调查,现在学了php,就自己试一下.程序短小精悍,适于学习.有两个文件,bj.html用于显示和采集表单信息.bj.php用于处理数据和反馈结果.突出之处在于可以上传 ...
- Android程序设计-简单手机通讯录
在微信中,手机QQ中你会发现软件读取手机通讯录这个功能,这个功能使得软件更好的与手机联系人绑定,从而达到分享,拨打电话,读取用户信息等操作.下面我们将通过一个demo实现这个功能 首先我们看一下效果图 ...
随机推荐
- NET Socket服务编程
smark https://github.com/IKende/ .NET Socket服务编程之-高效连接接入编 在.NET上编写网络服务深入都有2,3年了,而这些时间时如何在.NET里实现网络服务 ...
- LINUX下FD_SET介绍
刚刚了解了linux下select系统调用,函数原型是 #include <sys/select.h> #include <sys/time.h> int select(int ...
- vs2010下载链接中国简体(中国含msdn)
昨天一个朋友说vs2010中国版可下载,我开始不相信.只是周末.所以,我下载一试 果然,安装了中国版,原本msdn订户才能够下载,感谢朋友们上传. 文件名 cn_visual_studio_2010_ ...
- navigator获取参数
<script type="text/javascript" language="javascript"> document.write(" ...
- iOS基础 - 控制器
一.当两个控制器互为父子关系的时候,它们的view一般也是互为父子关系 比如想添加A控制器的view到B控制器的view上,就应该让A控制器成为B控制器的子控制器,而B控制器就称为A控制器的父控制器 ...
- 细节MARK
在刷vijos1046的时候遇到了一些细节,MARK一下 1.哲学之前有告诫我说,输出long long的数的时候,最好用cout,不然容易出现编译器的问题,今天算是领教了 2.对于数组赋值问题 me ...
- [转]在 Mac OS X上编译 libimobiledevice 的方法
link: http://blog.boceto.fr/2012/05/05/libimobiledevice-for-macosx/ The objective of the day: Compil ...
- [转]Iphone m3u8 segmenter from ffmpeg for video streaming
源地址:http://lukasz.cepowski.com/devlog/30,iphone-m3u8-segmenter-from-ffmpeg-for-video-streaming Recen ...
- Cassandra
NoSQL之Cassandra 9月初听了一个讲座,演讲者是张月同学,他给我们分享了Cassandra nosql数据库,讲得很精彩,听完之后收益良多. Cassandra是一个noSQL数据库, ...
- 7z文件格式及其源码
7z文件格式及其源码的分析(四) 这是7z文件格式及其源码的分析系列的第四篇. 上一篇讲到了7z文件静态结构的尾header部分.这一篇开始,将从7z实际压缩流程开始详细介绍7z文件尾header的详 ...