main.c代码块
#include"contact.h"
void menu(){
printf("***********************************\n");
printf("***** 1.ADD 2.DEL ******\n");
printf("***** 3.SEARCH 4.MODIFY ******\n");
printf("***** 5.SHOW 6.CLEAR ******\n");
printf("***** 7.SORT 8.SAVE ******\n");
printf("***** 0.EXIT ******\n");
printf("***********************************\n");
}
void test(){
int input = 0;
struct Contact con;
InitContact(&con);
menu();
do{
printf("请选择功能->:");
scanf("%d", &input);
switch(input){
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case CLEAR:
InitContact(&con);
printf("清空成功\n");
break;
case SORT:
SortContact(&con);
break;
case SAVE:
SaveContact(&con);
break;
case EXIT:
DrstroyContact(&con);
break;
}
}while(input);
}
int main(){
test();
return 0;
}
contact.c代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void InitContact(pContact pc){
//pc->sz = 0;
//memset(pc->data, 0, sizeof(pc->data));
pc->data = (PeoInfo*)calloc(DEAULT_SZ, sizeof(PeoInfo));
if(pc->data == NULL){
printf("%s\n", strerror(errno));
return;
}
pc->sz = 0;
pc->capacity = DEAULT_SZ;
LoadContact(pc);
}
int CheckCapacity(pContact pc){
if(pc->sz == pc->capacity){
PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity+INC_SZ)*sizeof(PeoInfo));
if(ptr != NULL){
pc->data = ptr;
pc->capacity += INC_SZ;
//printf("增容成功\n");
return 1;
}
else{
return 0;
}
}
return 1;
}
void AddContact(pContact pc){
if(CheckCapacity(pc) == 0)
return;
printf("请输入名字->:");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄->:");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入性别->:");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话->:");
scanf("%s", pc->data[pc->sz].tel);
printf("请输入地址->:");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
}
void ShowContact(pContact pc){
int i = 0;
printf("%10s\t%5s\t%5s\t%10s\t%12s\n", "name", "age", "sex", "tele", "addr");
for(i=0; i<pc->sz; i++){
printf("%10s\t%5d\t%5s\t%10s\t%12s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tel, pc->data[i].addr);
}
}
int Find(pContact pc, char name[]){
int i;
for(i=0; i<pc->sz; i++){
if(strcmp(pc->data[i].name, name) == 0)
return i;
}
return -1;
}
void DelContact(pContact pc){
char name[NAME_MAX];
int pos;
if(pc->sz == 0){
printf("通讯录为空,无法删除。\n");
return;
}
printf("请输入删除信息的名字->");
scanf("%s", name);
pos = Find(pc, name);
if(pos == -1){
printf("要删除的人不存在\n");
return;
}
for(; pos<pc->sz-1; pos++){
pc->data[pos] = pc->data[pos+1];
}
pc->sz--;
printf("删除成功\n");
}
void SearchContact(pContact pc){
char name[NAME_MAX];
int pos = 0;
printf("请输入要查找人的姓名->:");
scanf("%s", name);
pos = Find(pc, name);
if(pos == -1){
printf("你所查询的人不存在\n");
return;
}
printf("%10s\t%5s\t%5s\t%10s\t%12s\n", "name", "age", "sex", "tele", "addr");
printf("%10s\t%5d\t%5s\t%10s\t%12s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tel, pc->data[pos].addr);
}
void ModifyContact(pContact pc){
int pos;
char name[NAME_MAX];
printf("请输入您要修改人的姓名->:");
scanf("%s", name);
pos = Find(pc, name);
if(pos == -1){
printf("你所要修改的人不存在\n");
return;
}
else{
printf("请输入名字->:");
scanf("%s", pc->data[pos].name);
printf("请输入年龄->:");
scanf("%d", &pc->data[pos].age);
printf("请输入性别->:");
scanf("%s", pc->data[pos].sex);
printf("请输入电话->:");
scanf("%s", pc->data[pos].tel);
printf("请输入地址->:");
scanf("%s", pc->data[pos].addr);
}
}
void SortContact(pContact pc){
char tmp[20];
int temp;
int i, j;
for(i=0; i<pc->sz; i++){
for(j=i+1; j<pc->sz; j++){
if(strcmp(pc->data[i].name, pc->data[j].name) > 0){
strcpy(tmp, pc->data[i].name);
strcpy(pc->data[i].name, pc->data[j].name);
strcpy(pc->data[j].name, tmp);
temp = pc->data[i].age;
pc->data[i].age = pc->data[j].age;
pc->data[j].age = temp;
strcpy(tmp, pc->data[i].sex);
strcpy(pc->data[i].sex, pc->data[j].sex);
strcpy(pc->data[j].sex, tmp);
strcpy(tmp, pc->data[i].tel);
strcpy(pc->data[i].tel, pc->data[j].tel);
strcpy(pc->data[j].tel, tmp);
strcpy(tmp, pc->data[i].addr);
strcpy(pc->data[i].addr, pc->data[j].addr);
strcpy(pc->data[j].addr, tmp);
}
}
}
ShowContact(pc);
}
void DrstroyContact(pContact pc){
free(pc->data);
pc->data = NULL;
pc->capacity = 0;
pc->sz = 0;
}
void SaveContact(pContact pc){
FILE* pf = fopen("contact.txt", "rb");
int i = 0;
if(pf == NULL){
perror("open file for writ");
exit(EXIT_FAILURE);
}
for(i=0; i<pc->sz; i++){
fwrite(pc->data+i, sizeof(PeoInfo), 1, pf);
}
fclose(pf);
pf = NULL;
}
void LoadContact(pContact pc){
FILE* pf = fopen("contact.txt", "rb");
PeoInfo tmp = {0};
int i = 0;
if(pf == NULL){
perror("open file for read");
exit(EXIT_FAILURE);
}
while(fread(&tmp, sizeof(PeoInfo), 1, pf)){
CheckCapacity(pc);
pc->data[pc->sz++] = tmp;
}
fclose(pf);
pf = NULL;
return;
}
contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
enum Optain{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
CLEAR,
SORT,
SAVE
};
#define NAME_MAX 20
#define SEX_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 20
#define DEAULT_SZ 3
#define INC_SZ 2
typedef struct PeoInfo{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tel[TEL_MAX];
char addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact{
PeoInfo* data;
int sz;
int capacity;
}Contact, *pContact;
void InitContact(pContact pc);
void AddContact(pContact pc);
void ShowContact(pContact pc);
int Find(pContact pc, char name[]);
void DelContact(pContact pc);
void SearchContact(pContact pc);
void ModifyContact(pContact pc);
void SortContact(pContact pc);
void DrstroyContact(pContact pc);
void LoadContact(pContact pc);
void SaveContact(pContact pc);
#endif
文件存储的版本。
代码在运行使用前一定要提前在代码文件目录下提前创建一个空文件