通讯录——(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");}/*******************************************/

结果贴图:

这里写图片描述

这里写图片描述

这里写图片描述