电话簿荣耀升级版

2023年4月28日11:07:17

 本次更新了内存自动扩容以及简单的文件操作

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

typedef struct liaison {
    //总会有一些名字占了很大的空间
    char name[1024];
    //实际上这个类型也避免不了电话号码的溢出
    unsigned long phone;
}liaison;

typedef struct address_list {
    //指向动态分配的内存的指针
    liaison* address;
    //当前指针指向空间的最大容量
    int cap;
    int size;
}address_list;

//全局变量,如果在真的开发中它可能真的有用
//现在你把它写到主函数里也无所谓
address_list list;

enum {
    ADD = 1,
    DEL,
    MODIFY,
    ALL,
    EXIT,
};

//EXE窗口中的面板,随你心意设计
//没什么难度
void print_front() {
    printf("请选择您要进行的操作:\n");
    printf("1.添加联系人\n");
    printf("2.删除联系人\n");
    printf("3.修改联系人\n");
    printf("4.所有联系人\n");
    printf("5.退出通讯录\n");
}

void add(address_list* p, FILE* fp) {
    //将新加入的内容写入list
    printf("请输入联系人名称:>>");
    scanf("%s", p->address[p->size].name);
    printf("请输入联系人号码:>>");
    scanf("%d", &(p->address[p->size].phone));
    //将添加的东西写入文件当中
    fprintf(fp, "%d %s %d\n", p->size, p->address[p->size].name, p->address[p->size].phone);
    p->size++;
    //当动态分配的内存存满的时候
    if (p->size == p->cap) {
        //每次添加十个liaison的空间
        p->cap += 10;
        //重新分配内存
        p->address = (liaison*)realloc(p->address, list.cap * sizeof(liaison));
    }
}

void del(address_list* p, FILE* fp) {
    int i = 0;
    printf("请输入删除联系人的编号:");
    scanf("%d", &i);
    //判断我们的目标是否存在
    if (i > (p->size)) {
        printf("您的输入有误");
    }
    for (; i < (p->size); i++) {
        p->address[i] = p->address[i + 1];
    }
    p->size--;
    //关闭当前的文件
    fclose(fp);
    //删除我们原本的文件
    int ret = remove("D:\\demo\\address_list.txt");
    //判断是否删除成功了
    if (ret == 0)
    {
        printf("文件删除成功");
    }
    else
    {
        printf("错误:不能删除该文件");
        //你自己看着办吧
        system("pause");
    }
    //再次创建一个新的同名的文件
    fp = fopen("D:\\demo\\address_list.txt", "a+");
    //将我们存在内存中的内容写入新的文件之中
    for (int i = 0; i < p->size; i++) {
        fprintf(fp, "%d %s %d\n", i, p->address[i].name, p->address[i].phone);
    }

}

void modify(address_list* p, FILE* fp) {
    int i = 0;
    printf("请输入您要修改的联系人编号:");
    scanf("%d", &i);
    if (i > (p->size)) {
        printf("您的输入有误");
    }
    printf("请输入联系人名称:>>");
    scanf("%s", p->address[i].name);
    printf("请输入联系人号码:>>");
    scanf("%d", &(p->address[i].phone));
    //和上一个函数几乎一样的操作,我也就不多赘述了
    fclose(fp);
    int ret = remove("D:\\demo\\address_list.txt");
    if (ret == 0)
    {
        printf("文件删除成功");
    }
    else
    {
        printf("错误:不能删除该文件");
        system("pause");
    }
    fp = fopen("D:\\demo\\address_list.txt", "a+");
    for (int i = 0; i < p->size; i++) {
        fprintf(fp, "%d %s %d\n", i, p->address[i].name, p->address[i].phone);
    }

}

void all(address_list* p, FILE* fp) {
    //将我们动态内存中存储的信息全部写出来
    for (int i = 0; i < (p->size); i++) {
        printf("[ %d ]\t", i);
        printf("%s\t", (p->address[i].name));
        printf("%d\n", (p->address[i].phone));
    }
}

void player(FILE* fp) {
    //为了避免输入英文而导致的惨剧
    char ser_f[10];
    scanf("%s", &ser_f);
    int ser = atoi(ser_f);
    switch (ser) {
    case 0:
        printf("恭喜你,什么都没有发生");
        break;
    case ADD:
        add(&list, fp);
        break;
    case DEL:
        del(&list, fp);
        break;
    case MODIFY:
        modify(&list, fp);
        break;
    case ALL:
        all(&list, fp);
        break;
    case EXIT:
        fclose(fp);
        exit(0);
    default:
        printf("您的输入错误");
    }
}

void read_book(address_list* p, FILE* fp) {
    rewind(fp);
    int num1 = 0;
    char name[1024];
    int phone = 0;
    for (int k = 0; k < 512; k++) {
        //为了避免一些奇奇怪怪的读取
        fscanf(fp, "%d %s %d", &num1, name, &phone);
        //printf("%d %s %d\n", num1, name, phone);
        if ((k != 0 && num1 == 0) || name == NULL || phone == 0) {
            break;
        }
        p->size = num1;
        strcpy(p->address[p->size].name, name);
        p->address[p->size].phone = phone;
        p->size++;
    }
}

int main()
{
    FILE* fp = fopen("D:\\demo\\address_list.txt", "a+");
    if (fp == NULL) {
        puts("Fail to open file!");
        exit(0);
    }
    list.cap = 100;
    //开辟空间
    list.address = (liaison*)malloc(list.cap * sizeof(liaison));
    read_book(&list, fp);
    print_front();
    while (1) {
        player(fp);
    }
    return 0;
}

  • 作者:云雷屯176
  • 原文链接:https://blog.csdn.net/qq_56713382/article/details/121144675
    更新时间:2023年4月28日11:07:17 ,共 3081 字。