#include <stdio.h>
#include<assert.h>
//#include<malloc.h>
#include<string.h>
#include<windows.h> #define MailSize 100
#define MaxName 10
#define MaxAdress 20
#define MaxPhone 20 struct Person{
char name[MaxName];
int age;
char sex;
char adress[MaxAdress];
char phone[MaxPhone];
};
typedef struct Mail{
int ExistNum;
//int MaxNum;
struct Person peo[MailSize];
}ML,*MailList; enum mem_infor{
Name=,
Age,
Sex,
Adress,
Phone,
};
void Show_member(MailList s){
int i=;
if( == s->ExistNum){
printf("Mail is Null!");
return ;
}
printf("-------------------------------------------------\n");
printf("|Name | Age| Sex |Adress | Phone | \n"); while(i<s->ExistNum){
printf("%-10s",s->peo[i].name);
printf("%-5d",s->peo[i].age);
printf("%-5c",s->peo[i].sex);
printf("%-20s",s->peo[i].adress);
printf("%-20s",s->peo[i].phone);
printf("\n");
i++;
} }
void Add_member(MailList s,int num){
char na[],sex,adr[],pho[];
int a;
printf("\nInput: Name + Age + Sex(M/W) + Adress + Phone:>\n");
for(int i=s->ExistNum;i<s->ExistNum+num;++i){
scanf("%s %d %c %s %s",na,&a,&sex,adr,pho);
strcpy(s->peo[i].name,na);
s->peo[i].age=a;
s->peo[i].sex=sex;
strcpy(s->peo[i].adress,adr);
strcpy(s->peo[i].phone,pho);
}
s->ExistNum+=num;
printf("\nAdd Successful!\n");
}
int Research_member(const MailList s,char *na){
assert(na);
assert(s);
for(int i=;i<s->ExistNum;++i){
if(!strcmp(s->peo[i].name,na) )
return i;
}
return -;
}
void Delet_member(MailList s,char *na){
assert(s);
assert(na);
int locate=Research_member(s,na);
if(locate<) {
printf("\nDelet failed !");
return ;
}
for(int i=locate;i<s->ExistNum;++i){
s->peo[i]=s->peo[i+];
}
s->ExistNum--;
printf("Delet Successful!\n");
}
void swap(struct Person* p1,struct Person* p2){
struct Person tmp;
tmp=*p1;
*p1=*p2;
*p2=tmp;
}
void Sort_member(MailList s){
assert(s);
MailList ret=s;
for(int i=;i<s->ExistNum-;++i){
for(int j=i;j<s->ExistNum;++j){
if(strcmp(ret->peo[i].name,ret->peo[j].name)> )
swap(&ret->peo[i],&ret->peo[j]); //交换两个结构体
}
}
printf("\nSort Successful !");
} void Clear_member(MailList s){
s->ExistNum=;
printf("\nClear.....");
Sleep();
printf("\nClear finished!");
}
void Modify_member(MailList s){
assert(s);
char na[],sex,adr[],pho[];
int a,option,locate;
if(s->ExistNum <= ){
printf("通讯录为空,无法修改!");
return;
}
printf("\n选择修改位置:");
scanf("%d",&locate);
if(locate < s->ExistNum && locate>=){
printf("******************************\n");
printf("* 1--姓名 2--年龄 3--性别 *\n");
printf("* 4--住址 5--电话 *\n");
printf("******************************\n");
choose:
printf("\n请选择修改:>");
scanf("%d",&option);
switch(option){
case Name:{
printf("\n姓名修改为:");
scanf("%s",na);
strcpy(s->peo[locate].name,na);
break;
}
case Age:{
printf("年龄修改为:");
scanf("%d",&a);
s->peo[locate].age=a;
break;
}
case Sex:{
printf("性别修改为:");
scanf("%c",&sex);
s->peo[locate].sex=sex;
break;
}
case Adress:{
printf("住址修改为:");
scanf("%s",adr);
strcpy(s->peo[locate].adress,adr);
break;
}
case Phone:{
printf("\n电话修改为:");
scanf("%s",pho);
strcpy(s->peo[locate].phone,pho);
break;
}
default:
printf("\n选择错误!");
goto choose ;
}
printf("\nSuccessful !");
}
else{
printf("\n无法修改!");
}
}
void LoadFile(MailList s){
int i=;
FILE *rfp=fopen("MailList.bin","rb"); //读取二进制文件
if(rfp == NULL){
perror("open faild");
exit();
}
struct Person tmp = {};
while(fread(&tmp,sizeof(struct Person),,rfp)){
s->peo[i] = tmp;
i++;
}
if( == i){
printf("空文件!");
}
else{
s->ExistNum = i;
Show_member(s);
}
fclose(rfp);
}
void SaveToFile(MailList s){
FILE *wfp=fopen("MailList.bin","wb"); //为文件写入二进制流
if(wfp == NULL){
perror("NULL ");
exit();
}
for(int i=;i<s->ExistNum;++i){
fwrite(&s->peo[i],sizeof(struct Person),,wfp);
}
printf("Save Success!");
fclose(wfp);
}
int main(){ ML mail;
mail.ExistNum = ; //初始化为0
int option;
printf(" \t****************** MailList **********************\n");
printf(" \t* 1--Input Information 2--Delet Information * \n");
printf(" \t* 3--Search Information 4--Show Information *\n");
printf(" \t* 5--Sort 6--Clear Information *\n");
printf(" \t* 7--Modify Information 8--Save *\n");
printf(" \t* 9--Load Information 0--Eixt *\n");
printf(" \t**************************************************\n");
while(){
printf("\nPlease Choose:");
scanf("%d",&option);
switch(option){
case :
{
int num;
printf("\n录入人数:");scanf("%d",&num);
Add_member(&mail,num);
}
break;
case :{
char na[];
printf("\n输入删除人名:");
scanf("%s",na);
Delet_member(&mail,na);
break;
}
case :{
char na[];
printf("\n输入查找人名:");
scanf("%s",na);
int ret=Research_member(&mail,na);
if(ret<)
printf("\n没找到!");
else
printf("\n找到了!位置在:%d",ret);
break;
}
case :
Show_member(&mail);
break;
case :
Sort_member(&mail);
break;
case :
Clear_member(&mail);
break;
case :
Modify_member(&mail);
break;
case :
SaveToFile(&mail);
break;
case :
LoadFile(&mail);
break;
case :
exit();
break;
default:
break ;
}
}
return ;
}

比较挫版本。

简易 (I/O)版本通讯录的更多相关文章

  1. 简易付XP版本无法获取server.xml配置文件处理方案

    博客地址:https://blog.csdn.net/zdw_wym/article/details/40892535 把它添加到C:/WINDOWS/Microsoft.NET/Framework/ ...

  2. C语言之通讯录的模拟实现

    C语言之通讯录的模拟实现 在C语言学习结束之际,谨以此篇文章来对C语言的学习告一段落. 纲要: 通讯录的静态版本 通讯录的动态版本 通讯录的带文件版本 因为三种实现方法除了储存形式不同,其他都基本相同 ...

  3. WebSocket实现简易的FTP客户端

    WebScoket的简单应用,实现一个简易的FTP,即文件上传下载,可以查看上传人,下载次数,打开多个Web可以多人上传. 说在前面的话 文件传输协议(File Transfer Protocol,F ...

  4. C#代码

    http://www.cnblogs.com/zjfree/category/269738.html 超简易静态Web服务器 C# 生成不重复随机字符串 (1秒内生成1000000个) C# 读写IN ...

  5. Oracle 数据库 Database Express Edition 11g Release 2 (11.2) 错误解决集锦(安装方面)

    前言:第一次接触数据库,想下载个oracle试玩下(虽然听说一般大企业才用),到 官网下载 了个简易版 XE 版本,安装时要注意记住自己输入的数据库密码(口令)  还有安装路径不能含有空格(Do no ...

  6. 从零开始学C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)

    一.移除性算法 (remove)  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...

  7. ES6数组扩展

    前面的话 数组是一种基础的JS对象,随着时间推进,JS中的其他部分一直在演进,而直到ES5标准才为数组对象引入一些新方法来简化使用.ES6标准继续改进数组,添加了很多新功能.本文将详细介绍ES6数组扩 ...

  8. 利用ADO让普通人用excel读取oracle数据库表的通用办法

    Ref:http://blog.csdn.net/iamlaosong/article/details/8465177 Excel通过ADO方式连接到Oracle并操作Oracle给那些编程能力不强的 ...

  9. ES6 数组的扩展

    1. Array.from() Array.from()将类数组(array-like)对象与可遍历的对象转化为数组并返回. 下面是一个类数组 let arr = { '0':'a', '1':'b' ...

随机推荐

  1. Vboxmanage改动uuid报错的解决的方法

    我的环境: Virtualbox 4.3.10 r93012 操作系统:win7 问题:Virtualbox在使用拷贝的虚拟盘时会提示uuid冲突: Because a hard disk with ...

  2. bootstrap插件summernote 的使用

    一.有时Java工程中会用到summernote 编辑器,下面简单说一下引用 1.将summernote 相应的文件放到工程中(webapp下面) 2.建一个jsp文件,在文件中引入相应的js.css ...

  3. 自学Zabbix2.6-zabbix升级

    如果你从zabbix 1.6升级到1.8或者zabbix 1.8升级到zbbix 2.0,那么你需要额外执行sql文件(path.sql): 但是在2.0之后这些步骤都不需要手动做,如果你的版本很低, ...

  4. 自学Zabbix之路

    自学Zabbix之路[第一回]:初识Zabbix 1.1 自学Zabbix1.1-简介 1.2 自学Zabbix1.2-zabbix特性 1.3 自学Zabbix1.3-zabbix进程 自学Zabb ...

  5. git命令的使用

    git命令行的使用 0. 工作中常使用的命令行(小结) 假设我们工作共同使用的开发分支为dev,我自己的开发分支为dev_cx.安装git,在工作文件夹下打开git bash. $ git check ...

  6. 用maven建立java web项目

    1.在eclipse的菜单栏选择File->New->Other->Maven->Maven ,并在第一个框打勾,然后点击下一步 2.转换为java的Dynamic Web P ...

  7. MVC系列——一个异常消息传递引发的思考

    前言:最近在某个项目里面遇到一个有点纠结的小问题,经过半天时间的思索和尝试,问题得到解决.在此记录一下解决的过程,以及解决问题的过程中对.net里面MVC异常处理的思考.都是些老生常谈的问题,不多说, ...

  8. springboot 入门八-自定义配置信息(编码、拦截器、静态资源等)

    若想实际自定义相关配置,只需要继承WebMvcConfigurerAdapter.WebMvcConfigurerAdapter定义些空方法用来重写项目需要用到的WebMvcConfigure实现.具 ...

  9. 二叉树Binary_Tree(1):二叉树及其数组实现

    定义 二叉树: 二叉树是一种特殊的树.二叉树的特点是每个结点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树.更加严格的递归定义是:二叉树要么为空,要么由根结点.左子树 ...

  10. OC学习9——反射机制

    1.OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作. 通过NSObject类中定义的方法进行动态编程:因为绝大 ...