C语言通讯录(2)_用文件存储

这一个通讯录系统是将之前那个做了一点修改,里面添加了文件存储功能

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <assert.h>
typedef struct Person//人员信息
{   
    int age;
    char name[32];
    char sex[5];
    char phone[12];
    char address[32];
}person;

typedef struct NODE//节点
{
    person ren;
    struct NODE *next;
}node;

int menu()
{
    int choose = 0;
    printf ("---------------------------通讯录系统-------------------------\n");
    printf ("--------- 1、添加联系人               2、查找联系人   --------\n");
    printf ("--------- 3、修改联系人信息           4、删除联系人   --------\n");
    printf ("--------- 5、清空联系人               6、保存信息     --------\n");
    printf ("--------- 7、查看联系人信息           0、退出         --------\n");
    printf ("--------------------------------------------------------------\n");
    printf ("请选择>");
    scanf ("%d", &choose);
    return choose;
}

void insert(node **phead)
{
    node *p = (node *)malloc (sizeof (node) );

    printf ("name>");
    scanf ("%s", p->ren.name);

    printf ("sex>");
    scanf ("%s", p->ren.sex);

    printf ("age>");
    scanf ("%d", &(p->ren.age));

    printf ("phone>");
    scanf ("%s", p->ren.phone);

    printf ("address>");
    scanf ("%s", p->ren.address);

    p->next = *phead;
    *phead = p;

}

void show (node *phead)
{
    assert (phead);
    printf ("name\tsex\tage\tphone\t\taddress\n");
    while (phead != NULL)
    {
        printf ("%s\t%s\t%d\t%s\t%s\n", phead->ren.name, phead->ren.sex, phead->ren.age, phead->ren.phone, phead->ren.address);
        phead = phead->next;
    }
}

void find (node *phead)
{
    char name[32] = {0};
    assert (phead);
    printf ("请输入你要查找的人的姓名>");
    scanf ("%s", name);
    while (phead != NULL)
    {
        if (strcmp (name, phead->ren.name) == 0)
        {
            printf ("name\tsex\tage\tphone\t\taddress\n");
            printf ("%s\t%s\t%d\t%s\t%s\n", phead->ren.name, phead->ren.sex, phead->ren.age, phead->ren.phone, phead->ren.address);
            break;
        }
        phead = phead->next;
    }
    if(phead == NULL)
    {
        printf ("找不到此人!!!\n");
    }
}

int modify_menu()
{
    int choose = 0;
    printf ("---------------------------------------------\n");
    printf ("----1、姓名       2、性别      3、年龄  -----\n");
    printf ("----4、手机号     5、地址      0、取消  -----\n");
    printf ("---------------------------------------------\n");
    scanf ("%d", &choose);
    return choose;
}

void modify(node **phead)
{
    char name[32] = {0};
    int ret = 1;//选择要修改的项
    node *p = *phead;
    assert((*phead) != NULL);
    printf ("请输入你要修改的联系人的姓名>");
    scanf ("%s", name);
    while (p != NULL && ret)
    {
        if (strcmp (name, (p)->ren.name) == 0)
        {
            printf ("请选择你要修给的信息>\n");
            ret = modify_menu();
            switch (ret)
            {
            case 0:
                break;
            case 1://姓名
                printf ("new name>");
                scanf ("%s", p->ren.name);
                break;
            case 2://性别
                printf ("new sex>");
                scanf ("%s", p->ren.sex);
                break;
            case 3://年龄
                printf ("new age>");
                scanf ("%d", &p->ren.age);
                break;
            case 4://手机号
                printf ("new phone>");
                scanf ("%s", p->ren.phone);
                break;
            case 5://地址
                printf ("new address>");
                scanf ("%s", p->ren.address);
                break;
            default :
                printf ("输入错误!!!\n");
                break;
            }
            break;
        }
        p = p->next;
    }
    if (p == NULL)
    {
        printf ("没有这个人!!!\n");
    }
    show (*phead);
}

void delete_person (node** phead)
{
    char arr[32] = {0};
    node *prede = NULL;//要删除的节点的前一个节点
    node *de = *phead;//要删除的节点
    printf ("请输入你要删除的联系人姓名:");
    scanf ("%s", arr);
    while (de != NULL)
    {
        if (strcmp (arr, (*phead)->ren.name) == 0)//要删除的节点是第一个结点
        {
            (*phead) = (*phead) ->next;
            free (de);
            de = NULL;
            break;
        }
        else if (strcmp (arr, de->ren.name) == 0)//要删除的节点不是第一个节点
        {
            prede->next = de->next;
            free (de);
            de = NULL;
            break;
        }
        prede = de;
        de = de->next;
    }
    if (de == NULL)
    {
        printf ("没有找到此人, 操作失败!!!\n");
    }
    show (*phead);
}

void empty(node **phead)
{
    node *cur = *phead;
    node *pre = NULL;
    while (cur != NULL)
    {
        pre = cur;
        cur = cur->next;
        free(pre);
        pre = NULL;
    }
    if (cur == NULL)
    {
        printf ("清空成功!!!\n");
    }
}

void save (node *phead)
{
    FILE *fp;
    node *cur = phead;
    if ((fp = fopen ("1.txt", "w")) == NULL)
    {
        printf ("打开文件失败!!");
        return ;
    }
    while (cur != NULL)
    {
        fwrite(&(cur->ren), sizeof (cur->ren), 1, fp);//把信息存入文件(二进制形式)
        cur = cur->next;
    }
    if (cur == NULL)
    {
        printf ("保存成功!!!\n");
    }
    fclose (fp);
}

void read_from_file(node **phead)//从文件中读取联系人信息
{
    person ren;
    node *cur = NULL;
    FILE *fp ;
    if ((fp = fopen("1.txt", "r")) == NULL)
    {
        printf ("文件打开失败!!!\n");
        return ;
    }
    while (1)
    {
        if (fread(&ren, sizeof (ren), 1, fp) != 1)
        {
            break;
        }
        cur = (node *)(malloc (sizeof (node)));
        cur->ren = ren;
        cur ->next = NULL;
        cur->next = *phead;
        *phead = cur;
    }
    show (*phead);
    fclose (fp);//关闭文件
}


int main()
{
    node *phead = NULL;
    int ret = 0;
    printf ("=================================================\n");
    printf ("\t\t现有联系人信息\n");
    printf ("=================================================\n");
    read_from_file(&phead);
    printf ("=================================================\n\n\n");
    do
    {
        ret = menu();
        switch(ret)
        {
        case 0:
            /*quit(phead);*/
            break;
        case 1:
            insert(&phead);
            printf ("\n");
            break;
        case 2:
            find (phead);
            printf ("\n");
            break;
        case 3:
            modify(&phead);
            printf ("\n");
            break;
        case 4:
            delete_person (&phead);
            printf ("\n");
            break;
        case 5:empty(&phead);

            break;
        case 6:save(phead);

            break;
        case 7:show (phead);

            break;
        default:
            break;
        }
    }while ( ret );

    system ("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a__b__c__/article/details/80623041