C语言 通讯录(本地储存)

本文介绍了一个简易的通讯录管理系统的设计与实现,该系统使用C语言编写,具备添加、删除、修改、查找联系人等功能,并能将数据持久化存储。
#include "stdafx.h"
#include <string.h>
#include <stdlib.h>
void init();//初始化 读取磁盘信息到内存
bool menu();// 显示菜单和选择菜单
void add();//添加联系人
void show();//显示所有联系人
void save();//保存内存数据到磁盘文件
void remove();//删除一个联系人
void update(); //修改一个联系人
void find();
char* input(char *);
struct Person {//联系人数据结构
    char name[100];
    char tel[100]; 
};
char buf[100];
#define FILENAME "persons"//磁盘上未见名
Person persons[1000];//所有联系人结构数组
int n = 0;//联系人个数
int main()
{
    //先去读取已经有的联系人
    init();
    while (true) {
        if (!menu()) {
            break;
        }
    }
    return 0;
}
bool menu() {
    printf("1、增加一个联系人\n");
    printf("2、删除一个联系人\n");
    printf("3、修改一个联系人\n");
    printf("4、查找联系人\n");
    printf("5、显示所有联系人\n");
    printf("6、退出\n");
    char ch[100];
    printf("请输入功能代号:(1-6)");
    scanf_s("%s", ch, 100);

    switch (ch[0])
    {
    case '1':
        add();
        break;
    case '2':
        remove();
        break;
    case '3':
        update();
        break;
    case '4':
        find();
        break;
    case '5':
        show();
        break;
    case '6':
        return false;
        break;
    default:
        printf("无效的号码!\n");
        break;
    }
    return true;
}
void add () {
    Person temp;
    //得到姓名
    char *buf = input("请输入联系人姓名");
    strcpy_s(temp.name, buf);
    //得到电话
    buf = input("请输入联系人电话");
    strcpy_s(temp.tel, buf);
    //保存到内存
    persons[n] = temp;
    n++;
    //保存到磁盘
    save();
}
void save() {
    FILE * fp = NULL;
    fopen_s(&fp, FILENAME, "w");
    fwrite(&n, sizeof(int), 1, fp);
    for (int i = 0; i < n; i++) {
        fwrite(&persons[i], sizeof(Person), 1, fp);
    }
    fclose(fp);
    printf("磁盘更新!\n");
}
void show() {
    if (n < 1) {
        printf("对不起,真的还没有联系人呀!\n");
        return;
    }
    printf("编号\t\t姓名\t\t电话\n");
    for (int i = 0; i < n; i++) {
        printf("%d\t\t%s\t\t%s\n", i + 1, persons[i].name, persons[i].tel);
    }
}
void init() {
    //读文件
    FILE * fp = NULL;
    fopen_s(&fp, FILENAME, "r");
    if (fp != NULL) {
        fread(&n, sizeof(int), 1, fp);
        for (int i = 0; i < n; i++) {
            fread(&persons[i], sizeof(Person), 1, fp);
        }
    }
    else {
        return;
    }
    fclose(fp);
}
void remove()
{
    if (n > 0) //有人
    {
        show();//罗列所有人,给个编号
        printf("请输入你要删除联系人的编号(1-%d):", n);
        char buf[4];
        scanf_s("%s", buf, 4);
        int nn = atoi(buf);//把键盘上输入的字符串转换为整数
        if (nn<1 || nn>n) //输入编号验证
        {
            printf("对不起,你现在不能删除,因为是一个无效的编号!\n");
        }
        else {
            if (nn != n) //移动下面的联系人
            {
                for (int i = 0; i < n - nn; i++) {
                    persons[nn + i - 1] = persons[nn + i];
                }
            }
            n--;//总人数减去一个 
            save();//同步到磁盘
            printf("删除联系人成功!\n");
        }
    }
    else {
        printf("对不起,你现在不能删除,因为一个人也没有!\n");
    }


}
void update()
{

    if (n > 0) //有人
    {
        show();//罗列所有人,给个编号
        printf("请输入你要修改联系人的编号(1-%d):", n);
        scanf_s("%s", buf, 4);
        int nn = atoi(buf);//把键盘上输入的字符串转换为整数
        if (nn<1 || nn>n) //输入编号验证
        {
            printf("对不起,你现在不能修改,因为是一个无效的编号!\n");
        }
        else {
            printf("请输入你要修改的项目(a-所有,n-姓名,p-电话)");
            scanf_s("%s", buf, 100);
            if (buf[0] == 'a' || buf[0] == 'A')
            {
                char*buf =  input("请输入新的姓名");   
                strcpy_s(persons[nn - 1].name, buf);
                buf = input("请输入新的电话");
                strcpy_s(persons[nn - 1].tel, buf);
            }
            else if (buf[0] == 'n' || buf[0] == 'N')
            {
                char*buf = input("请输入新的姓名");
                strcpy_s(persons[nn - 1].name, buf);

            }
            else if (buf[0] == 'p' || buf[0] == 'P')
            {
                char *buf = input("请输入新的电话");
                strcpy_s(persons[nn - 1].tel, buf);
            }
            save();//同步到磁盘
            printf("修改联系人成功!\n");
        }
    }
    else {
        printf("对不起,你现在不能删除,因为一个人也没有!\n");
    }
}
void find()
{
    printf("请输入你要寻找的关键字(姓名或者电话)");
    char buf[100];
    scanf_s("%s",buf,100);
    int c = 0;
    for (int  i = 0; i < n; i++)
    {
        if (strcmp(persons[i].name, buf) == 0 || strcmp(persons[i].tel, buf) == 0)
        {
            printf("%s\t\t%s\n",persons[i].tel);
            c++;
        }

    }
    printf("一共找到了%d个人!\n",c);
}
char* input(char* msg)
{
    printf("%s:", msg);
    scanf_s("%s", buf, 100);
    return buf;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值