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 ...
随机推荐
- Class org.apache.struts2.json.JSONWriter can not access a member of
异常形式: Class org.apache.struts2.json.JSONWriter can not access a member of * 或是 Class com.googlecode. ...
- 用PowerShell批量部署wsp包
转:http://www.xuebuyuan.com/168337.html 提供wsp部署的参数: $wsppath:wsp文件所在的路径,如"c:\" $wspnames:路径 ...
- @DataProvider Method 参数传递
package roger.testng; import java.lang.reflect.Method; import org.testng.annotations.DataProvider; i ...
- Linux Kernel Schduler History And Centos7.2's Kernel Resource Analysis
本文分为概述.历史.el7.2代码架构图解三部分. 解决的问题: a.Kernel调度发展过程: b.以架构图的方式,详解el7.2具体调度实现.内核线程模型.调度时间片计算,以及探究整个Kernel ...
- 跟我学机器视觉-HALCON学习例程中文详解-测量圆环脚宽间距
跟我学机器视觉-HALCON学习例程中文详解-测量圆环脚宽间距 This example program demonstrates the basic usage of a circular meas ...
- Java笔记(二十六)……IO流上 字节流与字符流
概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...
- 一些有用的Azure工具
目前,Azure 没有为客户提供监控和管理托管服务的完整解决方案.为了获取网络信息,speedtest.net 提供了一种工具,用于测量响应时间.带宽和整体连接质量.可以使用 Matthew Roso ...
- git引用^和~的区别
这篇git文章必转:解答我一直的疑惑 http://www.cnblogs.com/hutaoer/archive/2013/05/14/3078191.html 一. 引子 在git操作中,我们可以 ...
- 终端ls显示的配色方案
打开~/.profile或者mac上的~/.bash_profile,加入: export CLICOLOR=1 export LSCOLORS=cxdxfxexbxegedabagacad 这是我的 ...
- sql server smo
在SQL Server2005以前的版本中,SQL分布式管理对象(SQL-DMO)为我们提供了非常有效的方法来通过编程的方式管理SQL Server.SQL-DMO支持基于COM的接口,开发人员可以通 ...