C语言实现电话本 动态开辟 信息存储于文件

时间:2023-03-09 16:35:12
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 ;
}