下面是我用C写的一个电话本小项目,实现的功能有:添加 删除 修改 查找 排序 清空 显示,功能还是比较全的,内存也是动态开辟的。能存储于本地,能从本地读出并显示

头文件部分代码,contact.h:

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#pragma warning(disable:4996) #define MAX_NAME 10
#define MAX_TEL 12
#define MAX_ADDR 20
#define MAX_SEX 5
#define MAX 1000
#define CAPACITY 3
#define FILENAME "contact.txt" typedef struct P
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tel[MAX_TEL];
char addr[MAX_ADDR]; }P; typedef struct Con
{
P* contact; //联系人信息
int len;//联系人数量
int capacity; //容量 }Con, *pCon; void init_mycon();
void add_mycon();
void del_mycon();
void search_mycon();
void mod_mycon();
void dis_mycon();
void clear_mycon();
void sort_mycon();
void exit_mycon();

 

程序部分,contact.c 部分代码:

 #include"contact.h"

 void load(pCon _con)
{
int i = ;
FILE* fp = fopen(FILENAME, "r");
if (fp == NULL)
{
perror("open the FILENAME for read\n");
exit(EXIT_FAILURE);
} fscanf(fp, "%d", &(_con->len));
while (_con->len >= _con->capacity)
{
P* cp = (P*)realloc(_con->contact, (_con->capacity + CAPACITY)*sizeof(P));
if ((cp != _con->contact) && (cp != NULL))
{
_con->contact = cp;
}
_con->capacity += CAPACITY;
} for (i = ; i < _con->len; i++)
{
fscanf(fp, "%s%s%d%s%s", _con->contact[i].name, _con->contact[i].sex, &(_con->contact[i].age),
_con->contact[i].tel, _con->contact[i].addr);
}
fclose(fp);
} void init_mycon(pCon _con)
{
_con->len = ;
_con->contact = (P*)malloc(CAPACITY * sizeof(P));
if (_con->contact == NULL)
{
perror("创建空间");
exit(EXIT_FAILURE);
}
memset(_con->contact, , CAPACITY);
_con->capacity = CAPACITY;
load(_con);
} int findpeo(pCon _con, char* name)
{
int i = ;
for (i = ; i < _con->len; i++)
{
if (strcmp(name, _con->contact[i].name) == )
{
return i;
}
}
return -;
} void add_mycon(pCon _con)
{
load(_con);
while(_con->len >= _con->capacity)
{
P* cp = realloc(_con->contact,(_con->capacity + CAPACITY)*sizeof(P));
if ((cp != _con->contact) && (cp != NULL))
{
_con->contact = cp;
}
_con->capacity += CAPACITY;
} printf("请输入姓名:");
scanf("%s",_con->contact[_con->len].name);
printf("请输入性别:");
scanf("%s",_con->contact[_con->len].sex);
printf("请输入年龄:");
scanf("%d",&(_con->contact[_con->len].age));
printf("请输入电话号码:");
scanf("%s",_con->contact[_con->len].tel);
printf("请输入地址:");
scanf("%s",_con->contact[_con->len].addr); _con->len++;
printf("添加成功\n");
} void dis_mycon(pCon _con)
{
int i = ;
if (_con->len == )
{
printf("无联系人\n");
return;
}
printf("%10s\t%3s\t%3s\t%12s\t%10s\n", "name", "sex", "age", "tel", "addr");
for (i = ; i < _con->len; i++)
{
printf("%10s\t%3s\t%3d\t%12s\t%10s\n", _con->contact[i].name,
_con->contact[i].sex, _con->contact[i].age,
_con->contact[i].tel, _con->contact[i].addr);
}
} void del_mycon(pCon _con)
{
char name[MAX_NAME] = { };
int set = ,i = ;
if (_con->len == )
{
printf("电话薄为空\n");
return;
}
printf("输入想删掉人的姓名:");
scanf("%s", name);
set=findpeo(_con,name);
if (set == -)
{
printf("联系人不存在\n");
return;
}
for (i = set; i < _con->len-; i++)
{
_con->contact[i] = _con->contact[i + ];
}
_con->len--;
printf("删除成功\n");
} void search_mycon(pCon _con)
{
char name[MAX_NAME] = { };
int i = ;
int set = ;
printf("请输入要查找人的姓名:");
scanf("%s", name);
set = findpeo(_con, name);
if (set == -)
{
printf("联系人不存在\n");
return;
}
printf("%10s\t%3s\t%3s\t%12s\t%10s\n", "name", "sex", "age", "tel", "addr");
printf("%10s\t%3s\t%3d\t%12s\t%10s\n", _con->contact[i].name,
_con->contact[i].sex, _con->contact[i].age,
_con->contact[i].tel, _con->contact[i].addr);
} void mod_mycon(pCon _con)
{
char name[MAX_NAME] = { };
char nname[MAX_NAME] = { };
char nsex[MAX_SEX] = {};
char ntel[MAX_TEL] = {};
char naddr[MAX_ADDR] = {}; int input = , choice = ;
int set = ;
if (_con->len == )
{
printf("没有可修改的信息\n");
return;
}
printf("请输入要修改人的姓名:");
scanf("%s", name);
set = findpeo(_con, name);
if (set == -)
{
printf("联系人不存在\n");
return;
}
else
{
printf("1.修改姓名 2.修改性别 3.修改年龄\n");
printf("4.修改电话 5.修改地址 0.保存并退出\n");
while (input)
{
printf("请选择:");
scanf("%d", &choice);
switch(choice)
{
case :
{
printf("请输入新的姓名:");
scanf("%s", nname);
strcpy(_con->contact[set].name, nname);
break;
}
case :
{
printf("请输入新的性别:");
scanf("%s", nsex);
strcpy(_con->contact[set].sex , nsex);
break;
}
case :
{
printf("请输入新的年龄:");
scanf("%d", &_con->contact[set].age);
break;
}
case :
{
printf("请输入新的电话:");
scanf("%s", ntel);
strcpy(_con->contact[set].tel, ntel);
break;
}
case :
{
printf("请输入新的地址:");
scanf("%s", naddr);
strcpy(_con->contact[set].addr, naddr);
break;
}
case :
{
input = ;
break;
}
default:
break;
}
}
}
}
int _compare(const void* cp1, const void* cp2)
{
P* p1= (P*)(cp1);
P* p2 = (P*)(cp2);
if (strcmp(p1->name, p2->name) > )
return ;
else
return -;
} void sort_mycon(pCon _con)
{
P* cp = _con->contact;
int i = ; if (_con->len == )
{
printf("电话本为空\n");
return;
}
qsort(_con->contact, _con->len, sizeof(P),_compare);
printf("排序成功:\n");
} void clear_mycon(pCon _con)
{
_con->len = ;
printf("清除成功\n");
} void exit_mycon(pCon _con)
{
int i = ;
FILE* fp = fopen(FILENAME, "w");
_con->capacity = _con->len;
if (NULL == fp)
{
perror("open the FILENAME for write");
exit(EXIT_FAILURE);
}
fprintf(fp, "%d ", _con->len);
for (i = ; i < _con->len; i++)
{
fprintf(fp, "%s %s %d %s %s ", _con->contact[i].name, _con->contact[i].sex, _con->contact[i].age,
_con->contact[i].tel, _con->contact[i].addr);
} fclose(fp);
}

运用了fprintf和fscanf两个函数,向本地文件中以文本形式写入和从本地文件中读出。

测试部分代码,test.c:

 #include"contact.h"

 enum OP
{
EXIT,
ADD,
DEL,
SERCH,
MOD,
SORT,
DIS,
CLEAR
}; void menu()
{
printf("*******************************************\n");
printf("********** 电话本 *************\n");
printf("******** 1.add 2.del ***********\n");
printf("******** 3.serch 4.mod ***********\n");
printf("******** 5.sort 6.dis ***********\n");
printf("******** 7.clear 0.exit ***********\n");
printf("*******************************************\n");
} int main()
{
int input = ;
Con mycon;
init_mycon(&mycon);
while (input)
{
menu();
printf("选择操作:"); scanf("%d",&input);
switch (input)
{
case ADD:
add_mycon(&mycon);
break;
case DEL:
del_mycon(&mycon);
break;
case SERCH:
search_mycon(&mycon);
break;
case MOD:
mod_mycon(&mycon);
break;
case SORT:
sort_mycon(&mycon);
break;
case DIS:
dis_mycon(&mycon);
break;
case CLEAR:
clear_mycon(&mycon);
break;
case EXIT:
exit_mycon(&mycon);
break;
default:
break;
}
} system("pause");
return ;
}

C语言实现电话本 动态开辟 信息存储于文件的更多相关文章

  1. 嵌入式-C语言基础:malloc动态开辟内存空间

    #include<stdio.h> #include<stdlib.h> int main() { // char *p;//定义一个野指针:没有让它指向一个变量的地址 // ...

  2. [C] 在 C 语言编程中实现动态数组对象

    对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态 ...

  3. 记一次开发:Qt简单电话本程序

    前言 断断续续学习C++一年了,现在要做课设,觉得控制台界面实在太难看,于是用Qt做一个图形化的程序出来. 学习Qt也没有多久,只是了解了个大概,这次开发基本上是啃了2天的官方帮助文档,然后利用各种Q ...

  4. 用java中的Arraylist实现电话本系统管理

    大致思路:创建一个电话本条目的类,在主类中实例化.用实例化的对象调用构造参数接收输入值,然后将此对象存入Arraylist的对象中,实现动态添加电话本条目. 该系统具备添加.删除.修改.查询所有和按姓 ...

  5. 微信电话本可免费拨打网络电话 通话一分钟约300K流量

    微信电话本新版本于昨日晚间发布,这是一款智能通讯增强软件,通话双方都下载此APP并开通免费通话功能就能使用微信电话本拨打免费网络电话,在对方无法接通情况下还能将音频转向语音信箱,微信电话本目前支持An ...

  6. 苹果IPhone手机由于更新了IOS7 Beta测试版导致“激活出错”后,如何还原电话本和照片方法

    苹果这狗日的,手段果然狠,因为用户提前升级了测试版又没有更新正式版,就突然把手机变砖头,既不让升级正式版,也不让备份手机中的信息,确实有必要这样吗? 我的手机是IPone4s,在看了6月Apple W ...

  7. Android-->发送短信页面实现(短信发送以及群发和从电话本中选择联系人)-----------》2

    分析下怎么写 首先,我们需要一个输入框,可以手动的输入手机号码, 其次,很少有人愿意手动输入,那么我们需要提供一个按钮来给我们的用户选择自己电话本中的联系人(一次可以选择多个即群发) 然后,我们需要一 ...

  8. jdbc电话本项目

    整体思路:在登陆之后才能查看自己的电话本,电话本中包含用户名,联系人名字,电话,性别,分类: 1.登陆注册页面--数据库User表,注册登陆使用 2.电话本的前段显示,用表格和表单, 3.创建存取的电 ...

  9. 转:用STL中的vector动态开辟二维数组

    用STL中的vector动态开辟二维数组 源代码:#include <iostream>#include <vector>using namespace std;int mai ...

随机推荐

  1. Java实现人民币大写精讲

    想要实现人民币大写,在发票等场景中使用?? 1234.56显示为:壹仟贰佰叁拾肆元伍角陆分,那就往下看看吧! 本程序可以实现 0 到 9999 9999 9999.994 以内的人民币大写转换,精确到 ...

  2. C#排序算法的比较

    首先通过图表比较不同排序算法的时间复杂度和稳定性. 排序方法 平均时间 最坏情况 最好情况 辅助空间 稳定性 直接插入排序 O(n2) O(n2) O(n) O(1) 是 冒泡排序 O(n2) O(n ...

  3. 【转】国内用户如何加快App Store的访问速度

    原文网址:http://www.app111.com/doc/100024206_1.html 作为国内互联网用户是比较可怜的,除了国外四大顶尖互联网服务不能访问外,就是App Store用得也比较痛 ...

  4. 由点击页面其它地方隐藏div所想到的jQuery的delegate

    对于这个问题一般有两种思路,这两种思路都会利用事件冒泡这一原理,想要详细了解Javascript事件机制可以看看JavaScript与HTML交互——事件,这不是本文重点,所以这里只是简单介绍一下事件 ...

  5. 数学物理学报Offprints and Remuneration

  6. 转载--配置WAMP开发环境

    转自:http://www.cnblogs.com/cardon/archive/2009/12/13/1622935.html 本例安装文件在这里下载       apache2.2.4 MySQL ...

  7. kafka的安装和使用

    简单说kafka是一个高吞吐的分部式消息系统,并且提供了持久化. kafka的架构 • producer:消息生存者• consumer:消息消费者• broker:kafka集群的server,负责 ...

  8. 搭建hdfs服务器集群的搭建+trash

    完全分布式搭建需要三台机器:node1.node2和node3 搭建时间之前首先要保持时间一致:date ntpdateyum install ntpdatentpdate -u ntp.sjtu.e ...

  9. linux的nohup命令的用法

    在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/my ...

  10. bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡(SAM)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3926   [题意]   给定一棵树,每个节点都有相应的颜色,且保证叶子数不超过20,问 ...