下面是我用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. INV Close Period & GL Import Journal > DML tables

    1.       (N) Inventory > Accounting Close Cycle > Inventory Accounting Periods     Insert data ...

  2. hadoop异常:java.lang.RuntimeException: java.lang.NoSuchMethodException

    出现异常的程序大致框架是这样的: public class getMaxTemperature extends Configured implements Tool { ... class MaxTe ...

  3. POJ_3185_The_Water_Bowls_(反转)

    描述 http://poj.org/problem?id=3185 20个碗,要全部反转过来.反转某个碗,其相邻的碗(左右两边)也要反转. The Water Bowls Time Limit: 10 ...

  4. ☀【Zepto】

    http://zeptojs.com/ https://github.com/madrobby/zepto Zepto 中文手册 http://www.360weboy.com/handbook/ze ...

  5. 基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程

    基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...

  6. Using the Task Parallel Library (TPL) for Events

    Using the Task Parallel Library (TPL) for Events The parallel tasks library was introduced with the ...

  7. asp.net基础

    这篇主要讲述以下基础知识: Request对象 Response对象 Server对象 Cookie对象 Application对象 ViewState对象 <%%>与<%=%> ...

  8. c pvr转存pvr.ccz格式

    pvr.ccz 是把pvr用zlib算法压缩后的图像格式,其优点是可以提升文件读取效率. 大多数情况下我们可以用一些工具来将pvr压缩到pvr.ccz ,下面提供一个c++方法来完成这个过程 int ...

  9. 【CSS3】Advanced3:Universal, Child, and Adjacent Selectors

    1.Universal selectors eg:#target*{ } 2.Child selectors < something immediately nested within some ...

  10. 使用C#模拟ASP.NET页面中按钮点击

    c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求 主要就组织要提交的数据,然后以post方式提交. 假设我们有如下的网页 1 <% @ Page Language = &q ...