#ifndef _CONTACT_H_
#define _CONTACT_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <windows.h>
#pragma warning(disable:4996)
#define NAME_SIZE 64
#define TEL_SIZE 16
#define ADDR_SIZE 128
#define LIST_DEFAULT 1
#define INC_SIZE 2
#define CT_FILE "contact.bin"
typedef struct person{
char name[NAME_SIZE];
char sex;
unsigned char age;
char telphone[TEL_SIZE];
char address[ADDR_SIZE];
}person_t, *person_p, **person_pp;
typedef struct contact{
int cap;
int size;
person_t list[0];
}contact_t, *contact_p, **contact_pp;
//Init
void InitContact(contact_pp _ctpp);
//Add
void AddPerson(contact_pp ct);
//Del
//Mod
//Search
//Sort
void Sort(contact_p ct);
//Clear
//Show
void Show(contact_p ct);
void Save(contact_p ct);
int Load(contact_pp _ctpp);
#endif
#include "contact.h"
//yes->1,no->0
static int IsFull(contact_p ct)
{
return ct->size == ct->cap ? 1 : 0;
}
//yes->1, no->0
static int Inc(contact_pp _ctpp)
{
int new_size = sizeof(contact_t)+((*_ctpp)->cap+INC_SIZE)*sizeof(person_t);
contact_p p = realloc(*_ctpp, new_size);
if (!p){
printf("Inc error!\n");
return 0;
}
p->cap = (*_ctpp)->cap + INC_SIZE;
*_ctpp = p;
printf("debug: Inc Contact Sucess!\n");
return 1;
}
int InitContactFile(contact_pp _ctpp, FILE *fp)
{
contact_p ct_p = (contact_p)malloc(sizeof(contact_t));
if (ct_p){
fread(ct_p, sizeof(contact_t), 1, fp);
int _cap = ct_p->cap;
int size = sizeof(contact_t)+ct_p->cap*sizeof(person_t);
contact_p p = (contact_p)realloc(ct_p, size);
if (p){
ct_p = p;
fread(ct_p->list, ct_p->cap*sizeof(person_t), 1, fp);
*_ctpp = ct_p;
return 1;
}
else{
return 0;
}
}
else{
return 0;
}
}
void InitContactDefault(contact_pp _ctpp)
{
//void Load();
*_ctpp = malloc(sizeof(contact_t)+sizeof(person_t)*LIST_DEFAULT);
if (NULL == *_ctpp){
printf("%s: %d\n", strerror(errno), errno);
exit(1);
}
(*_ctpp)->cap = LIST_DEFAULT;
(*_ctpp)->size = 0;
printf("debug: Init Contact Sucess!\n");
}
int Load(contact_pp _ctpp)
{
FILE *fp = fopen(CT_FILE, "rb");
if (NULL == fp){
printf("Init Contact Default!\n");
InitContactDefault(_ctpp);
return 1;
}
int ret = InitContactFile(_ctpp, fp);
fclose(fp);
return ret;
}
void Show(contact_p ct)
{
int top = ct->size;
int i = 0;
person_p p = ct->list;
for (; i < top; i++){
//姓名、性别、年龄、电话、住址
printf("|%-6s|%-2c|%-3d|%-12s|%-16s|\n",\
p[i].name, p[i].sex,p[i].age, p[i].telphone,p[i].address);
}
}
static int person_cmp(const void *x, const void *y)
{
person_p _x = (person_p)x;
person_p _y = (person_p)y;
return strcmp(_x->name, _y->name);
}
void Sort(contact_p ct)
{
person_p p = ct->list;
qsort(p, ct->size, sizeof(person_t), person_cmp);
}
void AddPerson(contact_pp ct)
{
if (!IsFull(*ct) || Inc(ct)){
person_p p = &((*ct)->list[(*ct)->size]);
printf("Please Enter Name: ");
scanf("%s", p->name);
printf("Please Enter Sex: ");
scanf(" %c", &(p->sex));
printf("Please Enter Age: ");
scanf(" %u", &(p->age));
printf("Please Enter Tel: ");
scanf(" %s", p->telphone);
printf("Please Enter Addr: ");
scanf(" %s", p->address);
((*ct)->size)++;
}
else{
printf("realloc error!\n");
return;
}
}
void Save(contact_p ct)
{
FILE *fp = fopen(CT_FILE, "wb");
if (NULL == fp){
printf("fopen error!\n");
return;
}
int size = sizeof(contact_t)+ct->cap * sizeof(person_t);
fwrite(ct, size, 1, fp);
fclose(fp);
}
#include "contact.h"
void Menu()
{
printf("#####################################\n");
printf("# 1. Show 2. Add 3. Del #\n");
printf("# 4. Mod 5. Search 6. Sort #\n");
printf("# 7. Clear 8. Save 9. Exit #\n");
printf("#####################################\n");
printf("Please Select: ");
}
int main()
{
volatile int quit = 0;
int select = 0;
contact_p ct;
Load(&ct);
while (!quit){
Menu();
scanf("%d", &select);
switch (select){
case 1:
Show(ct);
break;
case 2:
AddPerson(&ct);
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
Sort(ct);
break;
case 7:
break;
case 8:
break;
case 9:
Save(ct);
quit = 1;
break;
default:
break;
}
}
system("pause");
return 0;
}