Linux下使用C语言进行文件的读写操作—通讯录管理系统的实现

通讯录管理系统的实现:
1)进行程序后,需要有一个选择菜单。
2)需要添加电话号码,实现数据的管理。
3)需要删除电话号码,实现数据的管理。
4)需要进行数据列表,显示所有的电话号码信息。
5)需要根据一个姓名进行查找,查出这个用户的电话号码。
6)需要有文件写入功能,把信息保存到文件上。
7)要有文件读取功能,从文件中读取以前保持的数据。


contact.h
#ifndef define _CONTACT_H_
#define _CONTACT_H_

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//一些方便改的数
#define MAXNAME 20
#define MAXSEX 5
#define MAXTEL 20
#define MAXDOOR 30
#define MAX 1000
#define DEFAULTSIZE 3

//人的信息
typedef struct {
    char name[MAXNAME];
    char sex[MAXSEX];
    int age;
    char tel[MAXTEL];
    char address[MAXDOOR];
}person;

通讯录静态版本
//typedef struct {
//    person perinfo[MAX];
//    int sz;//当前通讯录中有效的人的个数
//}Contact;
//通讯录动态版本
typedef struct {
    person* perinfo;
    int sz;//通讯录中当前有的有效元素个数
    int capcity;//通讯录当前的容量
}Contact;

enum Option {
    EXIT,
    ADD,
    DELETE,
    FIND,
    CHANGE,
    SHOW,
    CLEAR,
    SORT,
};
int checkandexpansion(Contact* p);

int Initcontact(Contact* p);

void add(Contact* p);

void show(Contact* p);

void find(Contact* p);

void contactdelete(Contact* p);

void contactchange(Contact* p);

void contactclear(Contact* p);

void contactsort(Contact* p);

int exitable(Contact* p);




#endif


main.c

#include "contact.h"

void menu()
{
    printf("*******************************************\n");
    printf("************这是一个通讯录设备*************\n");
    printf("*******************************************\n");
    printf("********输入对应数字启动对应功能***********\n");
    printf("*******************************************\n");
    printf("******1.ADD******************2.DELETE******\n");
    printf("*******************************************\n");
    printf("******3.FIND*****************4.CHANGE******\n");
    printf("*******************************************\n");
    printf("******5.SHOW*****************6.CLEAR*******\n");
    printf("*******************************************\n");
    printf("******7.SORT*****************0.EXIT********\n");
    printf("*******************************************\n");
}
int main()
{
    int input = 0;
    //void(*pf[])(Contact*) = { exitable,add,contactdelete,
    //find,contactchange,show,contactclear,contactsort };
    Contact contact;
    int a = Initcontact(&contact);
    int b;
    if (a == -1)
    {
        return -1;
    }
    do {
        menu();
        scanf("%d", &input);
        //(*pf[input])(&contact);
        switch (input)
        {
        case ADD: add(&contact); break;
        case DELETE:contactdelete(&contact); break;
        case FIND:find(&contact); break;
        case CHANGE:contactchange(&contact); break;
        case SHOW:show(&contact); break;
        case CLEAR:contactclear(&contact); break;
        case SORT:contactsort(&contact); break;
        case EXIT: b = exitable(&contact);
            if (b == -1)
            {
                input = 5;
            }
            break;
        default: printf("输入错误 请重新输入\n");
        }
    } while (input != 0);

    return 0;
}

contact.c

#include "contact.h"

//静态的版本
//void Initcontact(Contact* p)
//{
//    p->sz = 0;
//    memset(&p->perinfo, 0, MAX * sizeof(person));
//}

int checkandexpansion(Contact* p)
{
    //增加容量
    if (p->capcity == p->sz)
    {
        person* ptr = (person*)realloc(p->perinfo, (p->capcity + 2) * sizeof(person));
        if (ptr == NULL)
        {
            return -1;
        }
        else
        {
            p->perinfo = ptr;
            p->capcity += 2;
            printf("增容成功!\n");
            return 0;
        }
    }
    return 1;
}



//动态版本
int Initcontact(Contact* p)
{
    p->sz = 0;
    p->perinfo = (person*)malloc(DEFAULTSIZE * sizeof(person));
    p->capcity = DEFAULTSIZE;
    FILE* pf = fopen("C:\\Users\\lenovo\\Desktop\\contact.txt", "rb");
    if (pf == NULL)
    {
        printf("打开文件失败\n");
        return -1;
    }
    person temp = { 0 };
    while (fread(&temp, sizeof(person), 1, pf) != 0)
    {
        checkandexpansion(p);
        p->perinfo[p->sz] = temp;
        p->sz++;
    }
    fclose(pf);
    pf = NULL;
    return 0;
}
//静态的add
//void add(Contact* p)
//{
//    if (p->sz == MAX)
//    {
//        printf("通讯录满了\n");
//    }
//    else
//    {
//        printf("请输入姓名\n");
//        scanf("%s", p->perinfo[p->sz].name);
//        printf("请输入性别\n");
//        scanf("%s", p->perinfo[p->sz].sex);
//        printf("请输入年龄\n");
//        scanf("%d", &(p->perinfo[p->sz].age));
//        printf("请输入电话\n");
//        scanf("%s", p->perinfo[p->sz].tel);
//        printf("请输入住址\n");
//        scanf("%s", p->perinfo[p->sz].address);
//        p->sz++;
//    }
//}
// 
//动态版本
void add(Contact* p)
{
    int ret = 1;
    //增加容量
    ret = checkandexpansion(p);
    if (ret != -1)
    {
        //录入新增人的信息
        printf("请输入姓名\n");
        scanf("%s", p->perinfo[p->sz].name);
        printf("请输入性别\n");
        scanf("%s", p->perinfo[p->sz].sex);
        printf("请输入年龄\n");
        scanf("%d", &(p->perinfo[p->sz].age));
        printf("请输入电话\n");
        scanf("%s", p->perinfo[p->sz].tel);
        printf("请输入住址\n");
        scanf("%s", p->perinfo[p->sz].address);
        p->sz++;
        printf("增加成功!\n");
    }
    else
    {
        printf("由于内存不足原因添加失败\n");
    }
}

void show(Contact* p)
{
    printf("%-20s\t%-5s\t%-s\t%-14s\t%-30s\n", "name", "sex", "age", "tel", "address");
    for (int i = 0; i < p->sz; i++)
    {
        printf("%-20s\t%-5s\t%-d\t%-14s\t%-30s\n", p->perinfo[i].name, p->perinfo[i].sex, p->perinfo[i].age, p->perinfo[i].tel, p->perinfo[i].address);
    }
}

void find(Contact* p)
{
    int a = 0;
    printf("如果你是要根据电话号查找,请输入1,如果要根据姓名查找,请输入0\n");
    scanf("%d", &a);
    if (a == 0)
    {
        char c[MAXNAME];
        printf("请输入查找姓名\n");
        scanf("%s", c);
        int ret = 0;
        for (int i = 0; i < p->sz; i++)
        {
            if (strcmp(c, p->perinfo[i].name) == 0)
            {
                printf("查找成功\n对应信息为\n");
                ret = 1;
                printf("%-20s\t%-5s\t%-d\t%-14s\t%-30s\n", p->perinfo[i].name, p->perinfo[i].sex, p->perinfo[i].age, p->perinfo[i].tel, p->perinfo[i].address);
                break;
            }
        }
        if (ret == 0)
        {
            printf("电话簿中查无此人,请核对此人的姓名是否输入正确\n");
        }
    }
    else if (a == 1)
    {
        int ret = 0;
        printf("请输入待查找的电话号码\n");
        char c[MAXTEL];
        scanf("%s", c);
        for (int i = 0; i < p->sz; i++)
        {
            if (strcmp(c, p->perinfo[i].tel) == 0)
            {
                printf("查找成功\n对应信息为\n");
                ret = 1;
                printf("%-20s\t%-5s\t%-d\t%-14s\t%-30s\n", p->perinfo[i].name, p->perinfo[i].sex, p->perinfo[i].age, p->perinfo[i].tel, p->perinfo[i].address);
                break;
            }
        }
        if (ret == 0)
        {
            printf("电话簿中查无此人,请核对此人的姓名是否输入正确\n");
        }
    }
    else
    {
        printf("输入错误,即将回到初始界面\n");
    }
}

void contactdelete(Contact* p)
{
    int a = 0;
    printf("如果你是要根据电话号删除,请输入1,如果要根据姓名删除,请输入0\n");
    scanf("%d", &a);
    if (a == 0)
    {
        char c[MAXNAME];
        printf("请输入要删除的姓名\n");
        scanf("%s", c);
        int ret = 0;
        int i = 0;
        for (i = 0; i < p->sz; i++)
        {
            if (strcmp(c, p->perinfo[i].name) == 0)
            {
                ret = 1;
                break;
            }
        }
        if (ret == 0)
        {
            printf("电话簿中查无此人,请核对此人的姓名是否输入正确\n");
        }
        else
        {
            for (int j = i; j < p->sz; j++)
            {
                p->perinfo[j] = p->perinfo[j + 1];
            }
            p->sz--;
            printf("删除成功\n");
        }
    }
    else if (a == 1)
    {
        int ret = 0;
        printf("请输入你要删除的电话号码\n");
        char c[MAXTEL];
        scanf("%s", c);
        for (int i = 0; i < p->sz; i++)
        {
            if (strcmp(c, p->perinfo[i].tel) == 0)
            {
                int j = i;
                for (j = i; i < p->sz; j++)
                {
                    p->perinfo[j] = p->perinfo[j + 1];
                }
                p->sz--;
                printf("删除成功\n");
                ret = 1;
                break;
            }
        }
        if (ret == 0)
        {
            printf("电话簿中查无此人,请核对此人的电话号码是否输入正确\n");
        }
    }
    else
    {
        printf("输入错误,即将回到初始界面\n");
    }
}

void contactchange(Contact* p)
{
    char c[MAXNAME];
    printf("请输入要待修改单位的姓名\n");
    scanf("%s", c);
    int ret = 0;
    for (int i = 0; i < p->sz; i++)
    {
        if (strcmp(c, p->perinfo[i].name) == 0)
        {
            int change[5] = { 0 };
            printf("是否需要修改姓名?需要修改姓名请输入1,否则输入0\n");
            scanf("%d", &change[0]);
            if (change[0] == 1)
            {
                printf("请输入新姓名\n");
                scanf("%s", p->perinfo[i].name);
            }
            printf("是否需要修改性别?需要修改性别请输入1,否则输入0\n");
            scanf("%d", &change[1]);
            if (change[1] == 1)
            {
                printf("请输入正确性别\n");
                scanf("%s", p->perinfo[i].sex);
            }
            printf("是否需要修改年龄?需要修改年龄请输入1,否则输入0\n");
            scanf("%d", &change[2]);
            if (change[2] == 1)
            {
                printf("请输入新年龄\n");
                scanf("%d", &(p->perinfo[i].age));
            }
            printf("是否需要修改电话号码?需要修改电话号码请输入1,否则输入0\n");
            scanf("%d", &change[3]);
            if (change[3] == 1)
            {
                printf("请输入新电话号码\n");
                scanf("%s", p->perinfo[i].tel);
            }
            printf("是否需要修改住址?需要修改住址请输入1,否则输入0\n");
            scanf("%d", &change[4]);
            if (change[4] == 1)
            {
                printf("请输入新住址\n");
                scanf("%s", p->perinfo[i].address);
            }
            ret = 1;
            printf("修改成功!\n");
            printf("此人的新联系信息为:\n");
            printf("%-20s\t%-5s\t%-d\t%-14s\t%-30s\n", p->perinfo[i].name, p->perinfo[i].sex, p->perinfo[i].age, p->perinfo[i].tel, p->perinfo[i].address);
            break;
        }
    }
    if (ret == 0)
    {
        printf("电话簿中查无此人,请核对此人的姓名是否输入正确\n");
    }
}

//静态版本
//void contactclear(Contact* p)
//{
//    Initcontact(p);
//}
//动态版本
void contactclear(Contact* p)
{
    memset(p->perinfo, 0, (p->sz) * sizeof(person));
    p->sz = 0;
    printf("清除成功!\n");
}

void contactsort(Contact* p)
{
    int i, j;
    char temp1[MAXNAME];
    char temp2[MAXSEX];
    int temp3;
    char temp4[MAXTEL];
    char temp5[MAXDOOR];
    for (i = 0; i < p->sz; i++)
    {
        for (j = 0; j < p->sz - 1 - i; j++)
        {
            if (strcmp(p->perinfo[j].name, p->perinfo[j + 1].name) > 0)
            {
                strcpy(temp1, p->perinfo[j].name);
                strcpy(temp2, p->perinfo[j].sex);
                temp3 = p->perinfo[j].age;
                strcpy(temp4, p->perinfo[j].tel);
                strcpy(temp5, p->perinfo[j].address);

                strcpy(p->perinfo[j].name, p->perinfo[j + 1].name);
                strcpy(p->perinfo[j].sex, p->perinfo[j + 1].sex);
                p->perinfo[j].age = p->perinfo[j + 1].age;
                strcpy(p->perinfo[j].tel, p->perinfo[j + 1].tel);
                strcpy(p->perinfo[j].address, p->perinfo[j + 1].address);

                strcpy(p->perinfo[j + 1].name, temp1);
                strcpy(p->perinfo[j + 1].sex, temp2);
                p->perinfo[j + 1].age = temp3;
                strcpy(p->perinfo[j + 1].tel, temp4);
                strcpy(p->perinfo[j + 1].address, temp5);
            }
        }
    }
    printf("排序成功!新的通讯录信息如下!\n");
    show(p);
}
int exitable(Contact* p)
{
    FILE* pf = fopen("C:\\Users\\lenovo\\Desktop\\contact.txt", "wb");
    if (pf == NULL)
    {
        printf("存储文件失败 请重新退出\n");
        return -1;
    }
    for (int i = 0; i < p->sz; i++)
    {
        fwrite(&(p->perinfo[i]), sizeof(person), 1, pf);
    }
    fclose(pf);
    pf = NULL;
    free(p->perinfo);
    p->perinfo = NULL;
    p->sz = 0;
    p->capcity = 0;
    printf("销毁成功!\n");
    printf("退出\n");
    return 0;
}

具体参考:

C语言的文件操作与通讯录写入文件_CS_boy的博客-CSDN博客 文件操作一、为什么使用文件  以我们写的通讯录为例,关闭了程序后再打开这个程序内容就不见了。因为我们的数据放在内存里,结束操作就还给操作系统了,为了改进这些事情,我们可以把这些数据放到硬盘里。  通讯录里数据,能不能也放在文件中,存储的磁盘上,做到持久化的效果。  我们只要把信息写在文件中就可以了。二、什么是文件  在程序设计中,我们一般把文件分为程序文件和数据文件。2.1 程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境 后 https://blog.csdn.net/CS_COPy/article/details/120513014