C语言实现电话本 动态开辟 信息存储于文件
下面是我用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语言实现电话本 动态开辟 信息存储于文件的更多相关文章
- 嵌入式-C语言基础:malloc动态开辟内存空间
#include<stdio.h> #include<stdlib.h> int main() { // char *p;//定义一个野指针:没有让它指向一个变量的地址 // ...
- [C] 在 C 语言编程中实现动态数组对象
对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态 ...
- 记一次开发:Qt简单电话本程序
前言 断断续续学习C++一年了,现在要做课设,觉得控制台界面实在太难看,于是用Qt做一个图形化的程序出来. 学习Qt也没有多久,只是了解了个大概,这次开发基本上是啃了2天的官方帮助文档,然后利用各种Q ...
- 用java中的Arraylist实现电话本系统管理
大致思路:创建一个电话本条目的类,在主类中实例化.用实例化的对象调用构造参数接收输入值,然后将此对象存入Arraylist的对象中,实现动态添加电话本条目. 该系统具备添加.删除.修改.查询所有和按姓 ...
- 微信电话本可免费拨打网络电话 通话一分钟约300K流量
微信电话本新版本于昨日晚间发布,这是一款智能通讯增强软件,通话双方都下载此APP并开通免费通话功能就能使用微信电话本拨打免费网络电话,在对方无法接通情况下还能将音频转向语音信箱,微信电话本目前支持An ...
- 苹果IPhone手机由于更新了IOS7 Beta测试版导致“激活出错”后,如何还原电话本和照片方法
苹果这狗日的,手段果然狠,因为用户提前升级了测试版又没有更新正式版,就突然把手机变砖头,既不让升级正式版,也不让备份手机中的信息,确实有必要这样吗? 我的手机是IPone4s,在看了6月Apple W ...
- Android-->发送短信页面实现(短信发送以及群发和从电话本中选择联系人)-----------》2
分析下怎么写 首先,我们需要一个输入框,可以手动的输入手机号码, 其次,很少有人愿意手动输入,那么我们需要提供一个按钮来给我们的用户选择自己电话本中的联系人(一次可以选择多个即群发) 然后,我们需要一 ...
- jdbc电话本项目
整体思路:在登陆之后才能查看自己的电话本,电话本中包含用户名,联系人名字,电话,性别,分类: 1.登陆注册页面--数据库User表,注册登陆使用 2.电话本的前段显示,用表格和表单, 3.创建存取的电 ...
- 转:用STL中的vector动态开辟二维数组
用STL中的vector动态开辟二维数组 源代码:#include <iostream>#include <vector>using namespace std;int mai ...
随机推荐
- win7 64位系统 pl/sql 无法解析指定的连接标识符解决办法
我用的是win764位,装好后,装了pl/sql 和toad,都连不上数据库,报错位“无法解析指定的连接标识符” 解决办法,经过研究发现安装目录有问题.默认会安装在“C:\Program Files ...
- PHP位运算 详细说明
在实际应用中可以做用户权限的应用我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参与 ...
- Unity3d 巫师3Ciri的渲染
--wolf96 16/10/6
- [JCWC2005]Draw
Einstein学起了画画,此人比较懒--,他希望用最少的笔画画出一张画...给定一个无向图,包含 n 个顶点(编号1~n),m 条边,求最少用多少笔可以画出图中所有的边 Input (draw.in ...
- Java笔记(十二)……类中各部分加载顺序及存放位置问题
什么时候会加载类 使用到类中的内容时加载,三种情况: 创建对象:new StaticDemo(); 使用类中的静态成员:StaticCode.num = 9; StaticCode.getNum() ...
- NOIP2015 子串 (DP+优化)
子串 (substring.cpp/c/pas) [问题描述] 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个 互不重 叠 的非空子串,然后把这 k 个子串按照其在字 ...
- 动态链接库(DLL)的使用
2013-07-04 http://blog.csdn.net/blpluto/article/details/5715182 感觉挺好,推荐去看看.
- localtime和localtime_r
上程序: #include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h ...
- HDOJ-ACM1010(JAVA) 奇偶剪枝法 迷宫搜索
转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5568822.html 第一次遇到迷宫搜索,给我的感觉是十分惊喜的:搞懂这个的话,感觉自己又掌握了一项技能~ 个人 ...
- 几乎每个文件里面都有 #ifdef __cplusplus extern "C" { #endif 可我没找到程序里那个地方定义了__cplusplus 啊?这又是怎么回事呢?
我们的C语言有个进化版,叫C++,这个想必楼主知道,Keil MDK是支持C++编程的,也就是说,你可以用C语言或者C++写你的程序,都可以. 但是,有一个问题,就是头文件的问题,C语言写的头文件C+ ...