作者主頁(yè):paper jie的博客_CSDN博客
本文作者:大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。
本文錄入于《C語(yǔ)言》專欄,本專欄是針對(duì)于大學(xué)生,編程小白精心打造的。筆者用重金(時(shí)間和精力)打造,將基礎(chǔ)知識(shí)一網(wǎng)打盡,希望可以幫到讀者們哦。
其他專欄:《算法詳解》《系統(tǒng)解析C語(yǔ)言》《C語(yǔ)言-語(yǔ)法篇》等
內(nèi)容分享:本期將用C的知識(shí)來(lái)通訊錄 將分為三個(gè)版本
目錄
前言
基本要求
通訊錄實(shí)現(xiàn)思想
通訊錄的構(gòu)成
設(shè)計(jì)思路
具體代碼
靜態(tài)版本
contact.h
contact.c
test.c
動(dòng)態(tài)版本
malloc_contact.h
malloc_contact.c
malloc_test.c
文件版本
FILE_contact.h
FILE_contact.c
test.c
總結(jié)
前言
在我們的日藏生活中,經(jīng)常會(huì)通過(guò)手機(jī)來(lái)互相聯(lián)系交流,而我們常常會(huì)把常聯(lián)系的電話號(hào)碼添加進(jìn)我們的通訊錄里面。它是一種利用互聯(lián)網(wǎng)或實(shí)現(xiàn)通訊錄信息同步更新和備份的應(yīng)用,服務(wù)。你可以在個(gè)人電腦、移動(dòng)電話等任何聯(lián)網(wǎng)設(shè)備上錄入你的聯(lián)系人的手機(jī),通信地址等通訊錄信息,或?qū)σ郧暗男畔⑦M(jìn)行分組、管理和更新,在你的許可下,該聯(lián)系人可以看到他所在組內(nèi)的其他聯(lián)系人信息,從而實(shí)現(xiàn)通訊錄共享,如果該聯(lián)系人更新自己的聯(lián)系信息,你的通訊錄會(huì)自動(dòng)更新,實(shí)現(xiàn)同步通訊錄,并留下舊版本的通訊錄信息。但這里的原理和代碼是怎么樣的我們就不得而知了。今天我們就通過(guò)C來(lái)編寫通訊錄的后端代碼,我們將分為三個(gè)版本來(lái)實(shí)現(xiàn),由易到難,干貨滿滿,大家放心食用。
基本要求
通訊錄可以存儲(chǔ)多個(gè)人的信息,信息需要包括:姓名 年齡 性別 地址 電話? ? ? ? ? ? ? ? ?
功能:
添加新增聯(lián)系人
刪除不需要的聯(lián)系人
查找聯(lián)系人
修改聯(lián)系人信息
查看所有聯(lián)系人信息
可以對(duì)聯(lián)系人進(jìn)行排序
通訊錄實(shí)現(xiàn)思想
通訊錄的構(gòu)成
為了讓代碼不會(huì)太過(guò)冗余,這里將用三個(gè)文件test.c contact.c contact.h 來(lái)存放代碼. test.c用于來(lái)測(cè)試我們的代碼, contact.c來(lái)實(shí)現(xiàn)通訊錄需要的函數(shù)代碼,contact.h用來(lái)存放函數(shù)的聲明和頭文件包含。
設(shè)計(jì)思路
添加一個(gè)菜單提示用戶如何使用
讓通訊錄可以多次使用
設(shè)置一個(gè)合理的變量為通訊錄,對(duì)通訊錄進(jìn)行初始化
實(shí)現(xiàn)功能所需要的函數(shù)
具體代碼
靜態(tài)版本
contact.h
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#define MAX 1000
#define MAX_NAME 10
#define MAX_SEX 4
#define MAX_ADDRESS 10
#define MAX_TELE 11
enum OPION
{
eit,
add,
del,
modfiy,
search,
show,
sort
};
typedef struct ProInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
char address[MAX_ADDRESS];
char tele[MAX_TELE];
int age;
}ProInfo;
typedef struct contact
{
ProInfo data[MAX];
int sz;
}contact;
//初始化
void Initcontact(contact* pc);
//添加
void addconcact(contact* pc);
//顯示
void showcontact(contact* pc);
//刪除
void delcontact(contact* pc);
//修改
void modfiycontact(contact* pc);
//查找
void searchcontact(contact* pc);
//排序
void sortcontact(contact* pc);
contact.c
#include "contact.h"
//初始化
void Initcontact(contact* pc)
{
memset(pc->data, 0, sizeof(pc->data));
pc->sz = 0;
}
//增加
void addconcact(contact* pc)
{
if (pc->sz == MAX)
{
printf("通迅錄已滿,無(wú)法再添加\n");
return;
}
printf("姓名:\n");
scanf("%s", pc->data[pc->sz].name);
printf("年齡:\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("性別:\n");
scanf("%s", pc->data[pc->sz].sex);
printf("電話:\n");
scanf("%s", pc->data[pc->sz].tele);
printf("住址:\n");
scanf("%s", pc->data[pc->sz].address);
pc->sz++;
printf("添加聯(lián)系人成功\n");
}
//顯示
void showcontact(contact* pc)
{
printf("%-8s\t%-6s\t%6s\t%-15s\t%-10s\n", "名字", "年齡", "性別", "電話", "住址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].address);
}
}
//查找
int Findcontact(contact* pc, char* name)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
//找到了
if (strcmp(pc->data[i].name, name) == 0)
return i;
}
//沒(méi)找到
return -1;
}
//刪除
void delcontact(contact* pc)
{
if (pc->sz == 0)
{
printf("通訊錄為空,無(wú)法刪除\n");
return;
}
char name[MAX_NAME] = {0};
printf("輸入要查找的對(duì)象:\n");
scanf("%s", name);
int del = Findcontact(pc, name);
if (del == -1)
{
printf("查找的人不存在\n");
return;
}
int i = 0;
for (i = del; del < pc->sz-1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("刪除成功\n");
}
//修改
void modfiycontact(contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("請(qǐng)輸入要修改的對(duì)象:\n");
scanf("%s", name);
int flag = Findcontact(pc, name);
if (flag == -1)
{
printf("修改對(duì)象不存在,修改失敗\n");
return;
}
printf("姓名:\n");
scanf("%s", pc->data[flag].name);
printf("年齡:\n");
scanf("%d", &(pc->data[flag].age));
printf("性別:\n");
scanf("%s", pc->data[flag].sex);
printf("電話:\n");
scanf("%s", pc->data[flag].tele);
printf("住址:\n");
scanf("%s", pc->data[flag].address);
}
//查找
void searchcontact(contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("請(qǐng)輸入查找的對(duì)象:\n");
scanf("%s", name);
int flag = Findcontact(pc, name);
if (flag == -1)
{
printf("查找失敗\n");
return;
}
printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n", pc->data[flag].name,
pc->data[flag].age,
pc->data[flag].sex,
pc->data[flag].tele,
pc->data[flag].address);
}
//名字排序
int comper_name(const void* e1, const void* e2)
{
return strcmp(((ProInfo*)e1)->name, ((ProInfo*)e2)->name);
}
//年齡排序
int comper_age(const void* e1, const void* e2)
{
return ((ProInfo*)e1)->age - ((ProInfo*)e2)->age;
}
//性別排序
int comper_sex(const void* e1, const void* e2)
{
return strcmp(((ProInfo*)e1)->sex, ((ProInfo*)e2)->sex);
}
//排序
void sortcontact(contact* pc)
{
printf("***************************\n");
printf("1. 名字排序 2. 年齡排序\n");
printf("3. 性別排序 \n");
printf("***************************\n");
printf("請(qǐng)選擇排序方法:");
int input = 0;
scanf("%d", &input);
switch (input)
{
case 1:
qsort(pc->data, pc->sz, sizeof(ProInfo), comper_name);
showcontact(pc);
printf("排序成功\n");
break;
case 2:
qsort(pc->data, pc->sz, sizeof(ProInfo), comper_age);
showcontact(pc);
printf("排序完成\n");
break;
case 3:
qsort(pc->data, pc->sz, sizeof(ProInfo), comper_sex);
showcontact(pc);
printf("排序完成\n");
break;
default:
printf("選擇錯(cuò)誤\n");
break;
}
}
test.c
#include "contact.h"
void menu()
{
printf("---------------------------------------------------\n");
printf("1.增加 2.刪除 \n");
printf("3.修改 4.查找 \n");
printf("5.顯示 6.排序 \n");
printf("0.退出 \n");
printf("---------------------------------------------------\n");
}
void test()
{
menu();
int input = 0;
contact con;
//初始化通訊錄
Initcontact(&con);
do
{
printf("請(qǐng)輸入:\n");
scanf("%d", &input);
switch (input)
{
case add:
//添加
addconcact(&con);
break;
case del:
//刪除
delcontact(&con);
break;
case modfiy:
//修改
modfiycontact(&con);
break;
case search:
//查找
searchcontact(&con);
break;
case show:
//顯示
showcontact(&con);
break;
case sort:
//排序
sortcontact(&con);
break;
case eit:
printf("退出成功\n");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
動(dòng)態(tài)版本
上面的版本我們發(fā)現(xiàn)通訊錄是固定的,添加滿后不能繼續(xù)添加,我們需要設(shè)計(jì)一個(gè)可以增容的代碼。
malloc_contact.h
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
#define MAX 2
#define MAX_NAME 10
#define MAX_SEX 4
#define MAX_ADDRESS 10
#define MAX_TELE 11
#define MAX_SZ 2
enum OPION
{
eit,
add,
del,
modfiy,
search,
show,
sort
};
typedef struct ProInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
char address[MAX_ADDRESS];
char tele[MAX_TELE];
int age;
}ProInfo;
typedef struct contact
{
ProInfo* data;
int sz;
int max;
}contact;
//初始化
void Initcontact(contact* pc);
//添加
void addconcact(contact* pc);
//顯示
void showcontact(contact* pc);
//刪除
void delcontact(contact* pc);
//修改
void modfiycontact(contact* pc);
//查找
void searchcontact(contact* pc);
//排序
void sortcontact(contact* pc);
//釋放空間
void Destroycontact(contact* pc);
malloc_contact.c
#include "contact.h"
//初始化
void Initcontact(contact* pc)
{
pc->data = (ProInfo*)malloc(MAX_SZ * sizeof(ProInfo));
pc->sz = 0;
pc->max = MAX_SZ;
}
//增加容量
int CheckCapacity(contact* pc)
{
ProInfo* pf = (ProInfo*)realloc(pc->data, (pc->max + MAX_SZ) * sizeof(ProInfo));
if (pf == NULL)
{
return 0;
}
pc->data = pf;
pc->max += MAX_SZ;
printf("增容成功\n");
return 1;
}
//增加
void addconcact(contact* pc)
{
if (pc->sz == pc->max)
{
if (0 == CheckCapacity(pc))
{
printf("通訊錄已滿,增容失敗\n");
return 1;
}
}
printf("姓名:\n");
scanf("%s", pc->data[pc->sz].name);
printf("年齡:\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("性別:\n");
scanf("%s", pc->data[pc->sz].sex);
printf("電話:\n");
scanf("%s", pc->data[pc->sz].tele);
printf("住址:\n");
scanf("%s", pc->data[pc->sz].address);
pc->sz++;
printf("添加聯(lián)系人成功\n");
}
//顯示
void showcontact(contact* pc)
{
printf("%-8s\t%-6s\t%6s\t%-15s\t%-10s\n", "名字", "年齡", "性別", "電話", "住址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].address);
}
}
//查找
int Findcontact(contact* pc, char* name)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
//找到了
if (strcmp(pc->data[i].name, name) == 0)
return i;
}
//沒(méi)找到
return -1;
}
//刪除
void delcontact(contact* pc)
{
if (pc->sz == 0)
{
printf("通訊錄為空,無(wú)法刪除\n");
return;
}
char name[MAX_NAME] = {0};
printf("輸入要查找的對(duì)象:\n");
scanf("%s", name);
int del = Findcontact(pc, name);
if (del == -1)
{
printf("查找的人不存在\n");
return;
}
int i = 0;
for (i = del; del < pc->sz-1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("刪除成功\n");
}
//修改
void modfiycontact(contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("請(qǐng)輸入要修改的對(duì)象:\n");
scanf("%s", name);
int flag = Findcontact(pc, name);
if (flag == -1)
{
printf("修改對(duì)象不存在,修改失敗\n");
return;
}
printf("姓名:\n");
scanf("%s", pc->data[flag].name);
printf("年齡:\n");
scanf("%d", &(pc->data[flag].age));
printf("性別:\n");
scanf("%s", pc->data[flag].sex);
printf("電話:\n");
scanf("%s", pc->data[flag].tele);
printf("住址:\n");
scanf("%s", pc->data[flag].address);
}
//查找
void searchcontact(contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("請(qǐng)輸入查找的對(duì)象:\n");
scanf("%s", name);
int flag = Findcontact(pc, name);
if (flag == -1)
{
printf("查找失敗\n");
return;
}
printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n", pc->data[flag].name,
pc->data[flag].age,
pc->data[flag].sex,
pc->data[flag].tele,
pc->data[flag].address);
}
//名字排序
int comper_name(const void* e1, const void* e2)
{
return strcmp(((ProInfo*)e1)->name, ((ProInfo*)e2)->name);
}
//年齡排序
int comper_age(const void* e1, const void* e2)
{
return ((ProInfo*)e1)->age - ((ProInfo*)e2)->age;
}
//性別排序
int comper_sex(const void* e1, const void* e2)
{
return strcmp(((ProInfo*)e1)->sex, ((ProInfo*)e2)->sex);
}
//排序
void sortcontact(contact* pc)
{
printf("***************************\n");
printf("1. 名字排序 2. 年齡排序\n");
printf("3. 性別排序 \n");
printf("***************************\n");
printf("請(qǐng)選擇排序方法:");
int input = 0;
scanf("%d", &input);
switch (input)
{
case 1:
qsort(pc->data, pc->sz, sizeof(ProInfo), comper_name);
showcontact(pc);
printf("排序成功\n");
break;
case 2:
qsort(pc->data, pc->sz, sizeof(ProInfo), comper_age);
showcontact(pc);
printf("排序完成\n");
break;
case 3:
qsort(pc->data, pc->sz, sizeof(ProInfo), comper_sex);
showcontact(pc);
printf("排序完成\n");
break;
default:
printf("選擇錯(cuò)誤\n");
break;
}
}
//釋放空間
void Destroycontact(contact* pc)
{
free(pc->data);
pc->data = NULL;
}
malloc_test.c
#include "contact.h"
void menu()
{
printf("---------------------------------------------------\n");
printf("1.增加 2.刪除 \n");
printf("3.修改 4.查找 \n");
printf("5.顯示 6.排序 \n");
printf("0.退出 \n");
printf("---------------------------------------------------\n");
}
void test()
{
menu();
int input = 0;
contact con;
//初始化通訊錄
Initcontact(&con);
do
{
printf("請(qǐng)輸入:\n");
scanf("%d", &input);
switch (input)
{
case add:
//添加
addconcact(&con);
break;
case del:
//刪除
delcontact(&con);
break;
case modfiy:
//修改
modfiycontact(&con);
break;
case search:
//查找
searchcontact(&con);
break;
case show:
//顯示
showcontact(&con);
break;
case sort:
//排序
sortcontact(&con);
break;
case eit:
Destroycontact(&con);
printf("退出成功\n");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
文件版本
上面的代碼雖然可以實(shí)現(xiàn)增容,但是可以發(fā)現(xiàn)一旦程序退出后,下次代碼再運(yùn)行起來(lái)上一次的數(shù)據(jù)就丟失了。我們需要一個(gè)可以一直保存數(shù)據(jù)的代碼。
FILE_contact.h
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
#define MAX 2
#define MAX_NAME 10
#define MAX_SEX 4
#define MAX_ADDRESS 10
#define MAX_TELE 11
#define MAX_SZ 2
enum OPION
{
eit,
add,
del,
modfiy,
search,
show,
sort
};
typedef struct ProInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
char address[MAX_ADDRESS];
char tele[MAX_TELE];
int age;
}ProInfo;
typedef struct contact
{
ProInfo* data;
int sz;
int max;
}contact;
//初始化
void Initcontact(contact* pc);
//添加
void addconcact(contact* pc);
//顯示
void showcontact(contact* pc);
//刪除
void delcontact(contact* pc);
//修改
void modfiycontact(contact* pc);
//查找
void searchcontact(contact* pc);
//排序
void sortcontact(contact* pc);
//釋放空間
void Destroycontact(contact* pc);
//保存
void Savecontact(contact* pc);
FILE_contact.c
#include "FILE_contact.h"
//初始化
int CheckCapacity(contact* pc);
void Loadcontact(contact* pc)
{
FILE* pf = fopen("contact.txt", "rb");
if (pf == NULL)
{
perror("Loadcontact");
return ;
}
ProInfo tmp = { 0 };
while (fread(&tmp, sizeof(ProInfo), 1, pf))
{
if (0 == CheckCapacity(pc))
return;
pc->data[pc->sz] = tmp;
pc->sz++;
}
fclose(pf);
pf = NULL;
}
void Initcontact(contact* pc)
{
pc->data = (ProInfo*)malloc(MAX_SZ * sizeof(ProInfo));
pc->sz = 0;
pc->max = MAX_SZ;
Loadcontact(pc);
}
//增加容量
int CheckCapacity(contact* pc)
{
if (pc->sz == pc->max)
{
ProInfo* pf = (ProInfo*)realloc(pc->data, (pc->max + MAX_SZ) * sizeof(ProInfo));
if (pf == NULL)
{
return 0;
}
pc->data = pf;
pc->max += MAX_SZ;
printf("增容成功\n");
return 1;
}
return 1;
}
//增加
void addconcact(contact* pc)
{
if (0 == CheckCapacity(pc))
{
printf("通訊錄已滿,增容失敗\n");
return 1;
}
printf("姓名:\n");
scanf("%s", pc->data[pc->sz].name);
printf("年齡:\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("性別:\n");
scanf("%s", pc->data[pc->sz].sex);
printf("電話:\n");
scanf("%s", pc->data[pc->sz].tele);
printf("住址:\n");
scanf("%s", pc->data[pc->sz].address);
pc->sz++;
printf("添加聯(lián)系人成功\n");
}
//顯示
void showcontact(contact* pc)
{
printf("%-8s\t%-6s\t%6s\t%-15s\t%-10s\n", "名字", "年齡", "性別", "電話", "住址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].address);
}
}
//查找
int Findcontact(contact* pc, char* name)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
//找到了
if (strcmp(pc->data[i].name, name) == 0)
return i;
}
//沒(méi)找到
return -1;
}
//刪除
void delcontact(contact* pc)
{
if (pc->sz == 0)
{
printf("通訊錄為空,無(wú)法刪除\n");
return;
}
char name[MAX_NAME] = { 0 };
printf("輸入要查找的對(duì)象:\n");
scanf("%s", name);
int del = Findcontact(pc, name);
if (del == -1)
{
printf("查找的人不存在\n");
return;
}
int i = 0;
for (i = del; del < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("刪除成功\n");
}
//修改
void modfiycontact(contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("請(qǐng)輸入要修改的對(duì)象:\n");
scanf("%s", name);
int flag = Findcontact(pc, name);
if (flag == -1)
{
printf("修改對(duì)象不存在,修改失敗\n");
return;
}
printf("姓名:\n");
scanf("%s", pc->data[flag].name);
printf("年齡:\n");
scanf("%d", &(pc->data[flag].age));
printf("性別:\n");
scanf("%s", pc->data[flag].sex);
printf("電話:\n");
scanf("%s", pc->data[flag].tele);
printf("住址:\n");
scanf("%s", pc->data[flag].address);
}
//查找
void searchcontact(contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("請(qǐng)輸入查找的對(duì)象:\n");
scanf("%s", name);
int flag = Findcontact(pc, name);
if (flag == -1)
{
printf("查找失敗\n");
return;
}
printf("%-8s\t%-6d\t%-6s\t%-15s\t%-10s\n", pc->data[flag].name,
pc->data[flag].age,
pc->data[flag].sex,
pc->data[flag].tele,
pc->data[flag].address);
}
//名字排序
int comper_name(const void* e1, const void* e2)
{
return strcmp(((ProInfo*)e1)->name, ((ProInfo*)e2)->name);
}
//年齡排序
int comper_age(const void* e1, const void* e2)
{
return ((ProInfo*)e1)->age - ((ProInfo*)e2)->age;
}
//性別排序
int comper_sex(const void* e1, const void* e2)
{
return strcmp(((ProInfo*)e1)->sex, ((ProInfo*)e2)->sex);
}
//排序
void sortcontact(contact* pc)
{
printf("***************************\n");
printf("1. 名字排序 2. 年齡排序\n");
printf("3. 性別排序 \n");
printf("***************************\n");
printf("請(qǐng)選擇排序方法:");
int input = 0;
scanf("%d", &input);
switch (input)
{
case 1:
qsort(pc->data, pc->sz, sizeof(ProInfo), comper_name);
showcontact(pc);
printf("排序成功\n");
break;
case 2:
qsort(pc->data, pc->sz, sizeof(ProInfo), comper_age);
showcontact(pc);
printf("排序完成\n");
break;
case 3:
qsort(pc->data, pc->sz, sizeof(ProInfo), comper_sex);
showcontact(pc);
printf("排序完成\n");
break;
default:
printf("選擇錯(cuò)誤\n");
break;
}
}
//釋放空間
void Destroycontact(contact* pc)
{
free(pc->data);
pc->data = NULL;
}
//保存
void Savecontact(contact* pc)
{
FILE* pf = fopen("contact.txt", "wb");
if (pf == NULL)
{
perror("fopen");
return;
}
int i = 0;
for (i = 0; i < pc->sz; i++)
{
fwrite(pc->data+i, sizeof(ProInfo), 1, pf);
}
fclose(pf);
pf = NULL;
}
文件部分:
int CheckCapacity(contact* pc);
void Loadcontact(contact* pc)
{
?? ?FILE* pf = fopen("contact.txt", "rb");
?? ?if (pf == NULL)
?? ?{
?? ??? ?perror("Loadcontact");
?? ??? ?return ;
?? ?}
?? ?ProInfo tmp = { 0 };
?? ?while (fread(&tmp, sizeof(ProInfo), 1, pf))
?? ?{
?? ??? ?if (0 == CheckCapacity(pc))
?? ??? ??? ?return;
?? ??? ?pc->data[pc->sz] = tmp;
?? ??? ?pc->sz++;
?? ?}?? ?fclose(pf);
?? ?pf = NULL;
}文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-601704.html
test.c
#include "FILE_contact.h"
void menu()
{
printf("---------------------------------------------------\n");
printf("1.增加 2.刪除 \n");
printf("3.修改 4.查找 \n");
printf("5.顯示 6.排序 \n");
printf("0.退出 \n");
printf("---------------------------------------------------\n");
}
void test()
{
menu();
int input = 0;
contact con;
//初始化通訊錄
Initcontact(&con);
do
{
printf("請(qǐng)輸入:\n");
scanf("%d", &input);
switch (input)
{
case add:
//添加
addconcact(&con);
break;
case del:
//刪除
delcontact(&con);
break;
case modfiy:
//修改
modfiycontact(&con);
break;
case search:
//查找
searchcontact(&con);
break;
case show:
//顯示
showcontact(&con);
break;
case sort:
//排序
sortcontact(&con);
break;
case eit:
Savecontact(&con);
Destroycontact(&con);
printf("退出成功\n");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
總結(jié)
到這里,三個(gè)版本的代碼就已經(jīng)寫完了。其實(shí)總的來(lái)看通訊錄的實(shí)現(xiàn)也不是很很難。就是用到了C中的結(jié)構(gòu)體,動(dòng)態(tài)管理和文件操作。上面的代碼都是對(duì)這些知識(shí)的掌握,學(xué)懂了這三部分的內(nèi)容,想必實(shí)現(xiàn)一個(gè)小小通訊錄對(duì)你來(lái)說(shuō)舉手之勞罷了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-601704.html
到了這里,關(guān)于C語(yǔ)言實(shí)現(xiàn)通訊錄(三合一版本)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!