通讯录——(C语言文件版本)
来源:互联网 发布:linux怎么修改文件权限 编辑:程序博客网 时间:2024/06/06 20:20
项目要求:
1、通讯录采用动态分配空间,并且以文件方式读取和存储个人的信息,每个人的信息包括:`姓名、性别、年龄、电话、住址`。2、通讯录基本要求如下:a、从文件中读入信息b、添加联系人信息c、删除指定联系人信息d、查找指定联系人信息e、修改指定联系人信息f、显示所有联系人信息g、清空所有联系人h、以名字排序所有联系人i、将信息写入文件
创建文件“address_list.txt”
文件内容初始化为0
test.c
#include"address_list.h"void address_list(PADDRESS plist)//通讯录主函数{ int input = 0; do { menu2(); printf("请选择:>"); scanf("%d", &input); switch (input) { case EXIT: break; case ADD: add(plist); break; case DELE: dele(plist); break; case SEARCH: search(plist); break; case MODIFY: modify(plist); break; case SHOW: show(plist); break; case CLEAR: clear(plist); break; case SORT: sort(plist); break; default: printf("输入有误,请重新输入!\n"); break; } } while (input);}void menu1(){ printf("************************\n"); printf("**** 0.EXIT 1.OPEN ****\n"); printf("************************\n");}void test(){ int input = 0; ADDRESS list; FILE *pfile = fopen("address_list.txt", "r");//以读的方式打开文件 loading(pfile,&list);//加载函数,加载文件中的信息进入程序 fclose(pfile);//关闭文件 do { menu1(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 0: break; case 1: address_list(&list); break; default: printf("输入有误,请重新输入!\n"); break; } } while (input); pfile = fopen("address_list.txt", "w");//以写的方式打开文件 unload(pfile,&list);//卸载函数 fclose(pfile);//关闭文件 free(list.pcon);//释放动态分配的内存空间}int main(){ test(); return 0;}
address_list.h
#ifndef __ADDRESS_LIST__#define __ADDRESS_LIST__#define _CRT_SECURE_NO_WARNINGS 1#include<stdlib.h>#include<stdio.h>#include<string.h>/***********************************************///数据结构#define NAME_MAX 12//最大姓名长度#define SEX_MAX 6//最大性别长度#define PHONE_MAX 13//最大电话长度#define ADDRESS_MAX 20//最大地址长度#define INCREASE 10//每次增加元素个数typedef struct list//联系人数据结构{ char name[NAME_MAX]; char sex[SEX_MAX]; int age; char phone[PHONE_MAX]; char address[ADDRESS_MAX];}CON,*PCON;typedef struct//通讯录数据结构{ PCON pcon; int stock;//库存 int depot;//仓库}ADDRESS,*PADDRESS;enum{ EXIT, ADD, DELE, SEARCH, MODIFY, SHOW, CLEAR, SORT};/***********************************************///功能函数实现void menu2();void add(PADDRESS pl);//添加函数void dele(PADDRESS pl);//删除函数void search(PADDRESS pl);//查找函数void modify(PADDRESS pl);//修改函数void show(PADDRESS pl);//显示函数void clear(PADDRESS pl);//清空函数void sort(PADDRESS pl);//排序函数/***********************************************///加載、卸載函數。void loading(FILE *pf, PADDRESS pl);void unload(FILE *pf, PADDRESS pl);/***********************************************/#endif//__ADDRESS_LIST__
address_list.c
#include"address_list.h"/*******************************************/void loading(FILE *pf, PADDRESS pl)//加载文件内容函数{ fscanf(pf, "%d", &(pl->stock)); if (pl->stock == 0) { pl->pcon = NULL; pl->depot = 0; printf("Loading success.\n"); } else { int i = 0; PCON tmp = NULL; tmp = (PCON)malloc((pl->stock)*sizeof(CON)); if (tmp == NULL) { printf("Loading file flunk\n"); } else { pl->pcon = tmp; pl->depot = pl->stock; for (i = 0; i < pl->stock; i++) { fscanf(pf, "%s%s%d%s%s\n", (pl->pcon + i)->name, (pl->pcon + i)->sex, &((pl->pcon + i)->age), (pl->pcon + i)->phone, (pl->pcon + i)->address); } printf("Loading success.\n"); } }}void unload(FILE *pf, PADDRESS pl)//卸载函数,将通讯录中的信息存入文件中。{ fprintf(pf, "%d ", pl->stock); if (pl->stock == 0) { ; } else { int i = 0; for (i = 0; i < pl->stock; i++) { fprintf(pf, "%s %s %d %s %s\n", (pl->pcon + i)->name, (pl->pcon + i)->sex, (pl->pcon + i)->age, (pl->pcon + i)->phone, (pl->pcon + i)->address); } printf("Unload success.\n"); }}/*******************************************/void menu2()//功能菜单函数实现{ printf("*********************************\n"); printf("**** 0.EXIT 1.ADD *****\n"); printf("**** 2.DELETE 3.SEARCH *****\n"); printf("**** 4.MODIFY 5.SHOW *****\n"); printf("**** 6.CLEAR 7.SORT *****\n"); printf("*********************************\n");}static int hunt(PADDRESS pl, const char *sour)//公共模块——搜寻函数{ int i = 0; for (i = 0; i < pl->stock; i++) { if (strcmp((pl->pcon + i)->name, sour) == 0) { return i; } } return -1;}void add(PADDRESS pl)//添加函数{ if (pl->stock == pl->depot) { PCON tmp = (PCON)realloc(pl->pcon, (pl->depot + INCREASE)*sizeof(CON)); if (tmp == NULL) { printf("Realloc flunk!\n"); } else { pl->pcon = tmp; pl->depot += INCREASE; goto flag; } } else { flag: printf("请输入联系人姓名:>"); scanf("%s", (pl->pcon + pl->stock)->name); printf("请输入联系人性别:>"); scanf("%s", (pl->pcon + pl->stock)->sex); printf("请输入联系人年龄:>"); scanf("%d", &((pl->pcon + pl->stock)->age)); printf("请输入联系人电话:>"); scanf("%s", (pl->pcon + pl->stock)->phone); printf("请输入联系人地址:>"); scanf("%s", (pl->pcon + pl->stock)->address); pl->stock++; printf("添加联系人成功!\n"); }}void dele(PADDRESS pl)//删除函数{ char tmp[NAME_MAX] = { 0 }; int ret = 0; printf("请输入要删除联系人姓名:>"); scanf("%s", tmp); ret = hunt(pl, tmp); if (ret == -1) { printf("未找到所要删除的联系人!\n"); } else { for (; ret < pl->stock-1; ret++) { *(pl->pcon + ret) = *(pl->pcon + ret + 1); } pl->stock--; printf("删除联系人成功!\n"); }}void search(PADDRESS pl)//查找函数{ char tmp[NAME_MAX] = { 0 }; int ret = 0; printf("请输入要查找联系人姓名:>"); scanf("%s", tmp); ret = hunt(pl, tmp); if (ret == -1) { printf("未找到所要查找的联系人!\n"); } else { printf("所要查找的联系人下标为:%d\n", ret + 1); }}void modify(PADDRESS pl)//修改函数{ char tmp[NAME_MAX] = { 0 }; int ret = 0; printf("请输入要查找联系人姓名:>"); scanf("%s", tmp); ret = hunt(pl, tmp); if (ret == -1) { printf("未找到所要修改的联系人!\n"); } else { printf("请输入联系人姓名:>"); scanf("%s", (pl->pcon + ret)->name); printf("请输入联系人性别:>"); scanf("%s", (pl->pcon + ret)->sex); printf("请输入联系人年龄:>"); scanf("%d", &((pl->pcon + ret)->age)); printf("请输入联系人电话:>"); scanf("%s", (pl->pcon + ret)->phone); printf("请输入联系人地址:>"); scanf("%s", (pl->pcon + ret)->address); printf("修改联系人成功!\n"); }}void show(PADDRESS pl)//显示函数{ int i = 0; printf("%-13s %-6s %-3s %-12s %-12s\n", "NAME", "SEX", "AGE", "PHONE", "ADDRESS"); for (i = 0; i < pl->stock; i++) { printf("%-13s %-6s %-3d %-12s %-12s\n", (pl->pcon + i)->name, (pl->pcon + i)->sex, (pl->pcon + i)->age, (pl->pcon + i)->phone, (pl->pcon + i)->address); }}void clear(PADDRESS pl){ free(pl->pcon); pl->pcon = NULL; pl->depot = 0; pl->stock = 0;}void sort(PADDRESS pl)//排序函数{ struct list tmp = { 0 }; int i = 0; for (i = 0; i < pl->stock - 1; i++) { int j = 0; for (j = 0; j < pl->stock - 1 - i; j++) { if (strcmp((pl->pcon + j)->name, (pl->pcon + j + 1)->name) > 0) { tmp = *(pl->pcon + j); *(pl->pcon + j) = *(pl->pcon + j + 1); *(pl->pcon + j + 1) = tmp; } } } printf("排序成功!\n");}/*******************************************/
结果贴图:
阅读全文
0 0
- 通讯录——(C语言文件版本)
- C语言实现通讯录系统——容量自增,文件版本
- 用C语言实现通讯录文件存储的版本
- 用C语言实现通讯录的文件版本
- 用C语言模拟实现通讯录的文件版本
- c语言通讯录的简单实现文件版本(动态开辟内存)
- 通讯录(C语言、文件保存)
- 通讯录(文件版本)
- 通讯录(文件版本)
- 通讯录小项目(C语言动态版本)
- 通讯录(C语言)
- 通讯录(C语言)
- C语言写通讯录 链表版本
- C语言写通讯录 数据库版本
- c语言实现动态版本通讯录
- 数据结构课程设计——通讯录系统设计(C语言)
- c语言——通讯录程序
- C语言项目——通讯录
- Java使用redis+sse实现带频道的网络聊天室
- # Volley之NetWorkImageView的源码解析与用法:
- 用户用户组配置文件相关文件格式说明
- bisonExe was not found
- 高次方尾数
- 通讯录——(C语言文件版本)
- (16)spring boot中集成Redis实例
- 第二十天 init初始化servlet,查询注入给Servlet的参数值
- 端午在即,难忘的经历——记一次php单次任务处理对内存超大需求的解决
- 字节序
- 第五个数是多少
- 《中国近代史》的读书笔记
- 35.不用加减乘除做加法
- java代码优化六大原则