下面是我用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. sdut2536字母哥站队(dp)

    简单DP  说是简单 还是推了好一会 推出来觉得好简单 保留当前i的最小值 dp[i] = min(dp[i],dp[j]+i-j-1) j<i #include <iostream> ...

  2. Memcached 拒绝服务漏洞

    漏洞名称: Memcached 拒绝服务漏洞 CNNVD编号: CNNVD-201401-176 发布时间: 2014-01-15 更新时间: 2014-01-15 危害等级:    漏洞类型:   ...

  3. 【转】Beyond Compare for Mac中文版震撼来袭!-- 不错

    原文网址:http://mt.sohu.com/20160329/n442685522.shtml Beyond Compare想必大家都知道,它是一个专业级的一个文件对比工具,由于工作原因,我们会经 ...

  4. 从零开始学习jQuery (六) AJAX快餐

    一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些许秘籍. 本篇文章讲解如何使用jQuery方便快捷的实现A ...

  5. dataframe 数据统计可视化---spark scala 应用

    统计效果: 代码部分: import org.apache.spark.sql.hive.HiveContext import org.apache.spark.{Logging, SparkConf ...

  6. getchar

    getchar函数每次只从缓冲区中接受一个字符. getchar有一个int型的返回值. 当程序调用getchar时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字 ...

  7. 代码-Weka的NaiveBayes类

    package kit.weka;   import java.io.File; import weka.classifiers.CheckClassifier; import weka.classi ...

  8. Maintainable JavaScript(编写可维护的JavaScript) PART I Style Guidelines

    “Programs are meant to be read by humans and only incidentally( 顺便:偶然地:附带地) for computers to execute ...

  9. JavaScript- The Good Parts Chapter 4

    Why, every fault’s condemn’d ere it be done:Mine were the very cipher of a function. . .—William Sha ...

  10. 使用Git push时出现的一些问题处理

    1.第一个问题 Permission denied (publickey). fatal: Could not read from remote repository. Please make sur ...