通讯录的文件版本(产品经理又来加需求了!)

简介: 通讯录的文件版本(产品经理又来加需求了!)

通讯录的文件版本


1. 需求


在学习了文件操作之后 我们学会了如何读写文件


现在产品经理跑了过来 对我们说 通讯录的功能还不是太完善


要求我们增加一个持久化保存的功能 (就你小子天天嚷嚷着要我加需求是吧)


2. 实现


我们先想想 要做到一个持久化的通讯录 我们首先要做到保存数据


打开我们的文件


int main()
{
  struct contact c1;
  inicontact(&c1);
  int input = 1;
  do
  {
    menu();
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      system("cls");
      addpeople(&c1);
      break;
    case 2:
      system("cls");
      delpeople(&c1);
      break;
    case 3:
      system("cls");
      srhpeople(&c1);
      break;
    case 4:
      system("cls");
      revpeople(&c1);
      break;
    case 5:
      system("cls");
      showpeople(&c1);
      break;
    case 6:
      system("cls");
      inicontact(&c1);
      break;
    case 7:
      system("cls");
      sortpeople(&c1);
      break;
    case 0:
      system("cls");
      killpeople(&c1);
      break;
    default:
      break;
    }
  } while (input);
  return 0;


在我们的第 case 0中 销毁通讯录之前 我们先创建一个文件保存数据


我们规定 保存文件的函数叫做 speople()


代码表示如下


void speople(struct contact* pc)
{
  FILE* pf = fopen("test.txt", "rw");
  if (pf==NULL)
  {
    perror("fopen");
  }
  // 写数据
  int i;
  for ( i = 0; i <pc->sz; i++)
  {
    fwrite(pc->date + i, sizeof(struct address), 1, pf);
  }
  fclose(pf);
  pf = NULL;
}


很简单的一个打开文件 写入数据


之后呢 我们在保存这个数据之后 我们希望 在每次打开通讯录之前 写入之前的数据


void loadcontact(struct contact* pc)
{
  FILE* pf = fopen("test.dat", "rb");
  if (pf == NULL)
  {
    perror("fopen");
  }
  struct address tmp = { 0 };
  while ((fread(&tmp,sizeof(struct address),1,pf)))
  {
    pc->date[pc->sz] = tmp;
    pc->sz++;
    if ((pc->sz) == (pc->max))
    {
      pc->date = (struct address*)realloc(pc->date, ((pc->max) + 2) * sizeof(struct address));
      printf("扩容成功\n");
      pc->max += 2;
    }
  }
}


我们这里可以发现 在初始化的时候可以将这些数据也初始化放进去


运行效果如下

58c1093404e3403e9e5adbcd84c9a8c6.png

002ab362d8084d4496678067970910ee.png


我们可以发现 原来的数据保存进来了


所有文件


附上前面两个版本的连接


1 测试文件


#define _CRT_SECURE_NO_WARNINGS 1
#include "address.h"
int main()
{
  struct contact c1;
  inicontact(&c1);
  int input = 1;
  do
  {
    menu();
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      system("cls");
      addpeople(&c1);
      break;
    case 2:
      system("cls");
      delpeople(&c1);
      break;
    case 3:
      system("cls");
      srhpeople(&c1);
      break;
    case 4:
      system("cls");
      revpeople(&c1);
      break;
    case 5:
      system("cls");
      showpeople(&c1);
      break;
    case 6:
      system("cls");
      inicontact(&c1);
      break;
    case 7:
      system("cls");
      sortpeople(&c1);
      break;
    case 0:
      system("cls");
      speople(&c1);
      killpeople(&c1);
      break;
    default:
      break;
    }
  } while (input);
  return 0;
}


2 头文件


#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include <windows.h>
void menu();
void inicontact(struct contact* pc);
void addpeople(struct contact* pc);
void delpeople(struct contact* pc);
void srhpeople(struct contact* pc);
void revpeople(struct contact* pc);
void showpeople(struct contact* pc);
void sortpeople(struct contact* pc);
void killpeople(struct contact* pc);
int cmp(struct contact* pc);
void speople(struct contact* pc);
struct address
{
  char name[10];
  char sex[5];
  int age;
  char tel[15];
  char address[20];
};
struct contact
{
  struct address* date;
  int sz;
  int max;
};
void loadcontact(struct contact* pc);


3 主文件


#define _CRT_SECURE_NO_WARNINGS 1
#include "address.h"
void menu()
{
  printf("------------------------------------\n");
  printf("--------请选择你要实现的功能--------\n");
  printf("--------1.添加联系人信息------------\n");
  printf("--------2.删除指定联系人信息--------\n");
  printf("--------3.查找指定联系人信息--------\n");
  printf("--------4.修改指定联系人信息--------\n");
  printf("--------5.显示所有联系人信息--------\n");
  printf("--------6.清空所有联系人------------\n");
  printf("--------7.以名字排序所有联系人------\n");
}
// 初版初始化 
//void inicontact(struct contact* pc)
//{
//  pc->sz = 0;
//  memset(pc->date, 0, 100*sizeof(struct address));
//}
// 
// 动态版本
//void inicontact(struct contact* pc)
//{
//  pc->sz = 0;
//  pc->max = 3;
//  pc->date = (struct address*)calloc(3, sizeof(struct address));
//
//
//}
void loadcontact(struct contact* pc)
{
  FILE* pf = fopen("test.dat", "rb");
  if (pf == NULL)
  {
    perror("fopen");
  }
  struct address tmp = { 0 };
  while ((fread(&tmp,sizeof(struct address),1,pf)))
  {
    pc->date[pc->sz] = tmp;
    pc->sz++;
    if ((pc->sz) == (pc->max))
    {
      pc->date = (struct address*)realloc(pc->date, ((pc->max) + 2) * sizeof(struct address));
      printf("扩容成功\n");
      pc->max += 2;
    }
  }
  fclose(pf);
  pf = NULL;
}
 void inicontact(struct contact* pc)
{
  pc->sz = 0;
  pc->max = 3;
  pc->date = (struct address*)calloc(3, sizeof(struct address));
  loadcontact(pc);
}
// 初始版本的增加联系人
//void addpeople(struct contact* pc)
//{
//  if (pc->sz==100)
//  {
//    printf("通讯录已满 无法继续添加");
//    return 0;
//  }
//  printf("请输入姓名\n");
//  scanf("%s", &(pc->date[pc->sz].name));
//  printf("请输入性别\n");
//  scanf("%s", &(pc->date[pc->sz].sex));
//  printf("请输入年龄\n");
//  scanf("%d", &(pc->date[pc->sz].age));
//  printf("请输入电话\n");
//  scanf("%s", &(pc->date[pc->sz].tel));
//  printf("请输入住址\n");
//  scanf("%s", &(pc->date[pc->sz].address));
//  printf("添加联系人完毕\n");
//  pc->sz++;
//}
void addpeople(struct contact* pc)
{
  if ((pc->sz) == (pc->max))
  {
    pc->date = (struct address*)realloc(pc->date, ((pc->max) + 2) * sizeof(struct address));
    printf("扩容成功\n");
    pc->max += 2;
  }
  printf("请输入姓名\n");
  scanf("%s", &(pc->date[pc->sz].name));
  printf("请输入性别\n");
  scanf("%s", &(pc->date[pc->sz].sex));
  printf("请输入年龄\n");
  scanf("%d", &(pc->date[pc->sz].age));
  printf("请输入电话\n");
  scanf("%s", &(pc->date[pc->sz].tel));
  printf("请输入住址\n");
  scanf("%s", &(pc->date[pc->sz].address));
  printf("添加联系人完毕\n");
  pc->sz++;
}
void delpeople(struct contact* pc)
{
  char name1[10];
  int input1;
  printf("请输入你要删除的联系人\n");
  scanf("%s", &name1);
  int i;
  for (i = 0; i < (pc->sz); i++)
  {
    if (strcmp(pc->date[i].name, name1) == 0)
    {
      printf("查到到联系人%s是否确认删除(1or0)\n", name1);
      scanf("%d", &input1);
      if (input1 == 1)
      {
        for (int j = i; j < ((pc->sz) - 1); j++)
        {
          (pc->date[j]) = (pc->date[j + 1]);
          pc->sz--;
        }
        printf("删除成功\n");
      }
      else
      {
        printf("成功取消\n");
      }
    }
  }
  if (i >= (pc->sz))
  {
    printf("联系人%s不存在\n", name1);
  }
}
void srhpeople(struct contact* pc)
{
  char name1[10];
  printf("请输入你要查找的联系人\n");
  scanf("%s", &name1);
  int i;
  for (i = 0; i < (pc->sz); i++)
  {
    if (strcmp(pc->date[i].name, name1) == 0)
    {
      printf("%-10s\t %-15s\t %-3s\t %-15s\t %-20s\t\n",
        "name", "sex", "age", "tel", "address");
      printf("%-10s\t %-15s\t %-3d\t %-15s\t %-20s\t\n",
        pc->date[i].name,
        pc->date[i].sex,
        pc->date[i].age,
        pc->date[i].tel,
        pc->date[i].address);
    }
  }
  if (i > pc->sz)
  {
    printf("不存在此联系人%s\n", name1);
  }
}
void revpeople(struct contact* pc)
{
  char name1[10];
  printf("请输入你要修改的联系人\n");
  scanf("%s", &name1);
  int i;
  for (i = 0; i < (pc->sz); i++)
  {
    if (strcmp(pc->date[i].name, name1) == 0)
    {
      printf("请输入姓名\n");
      scanf("%s", &(pc->date[i].name));
      printf("请输入性别\n");
      scanf("%s", &(pc->date[i].sex));
      printf("请输入年龄\n");
      scanf("%d", &(pc->date[i].age));
      printf("请输入电话\n");
      scanf("%s", &(pc->date[i].tel));
      printf("请输入住址\n");
      scanf("%s", &(pc->date[i].address));
      printf("修改联系人完毕\n");
    }
  }
  if (i > pc->sz)
  {
    printf("不存在此联系人%s\n", name1);
  }
}
void showpeople(struct contact* pc)
{
  int i;
  printf("%-10s\t %-15s\t %-3s\t %-15s\t %-20s\t\n",
    "name", "sex", "age", "tel", "address");
  for (i = 0; i < (pc->sz); i++)
  {
    printf("%-10s\t %-15s\t %-3d\t %-15s\t %-20s\t\n",
      pc->date[i].name,
      pc->date[i].sex,
      pc->date[i].age,
      pc->date[i].tel,
      pc->date[i].address);
  }
}
int cmp(void* e1, void* e2)
{
  struct address* p1 = (struct address*)e1;
  struct address* p2 = (struct address*)e2;
  return strcmp(p1->name, p2->name);
}
void sortpeople(struct contact* pc)
{
  qsort(pc, pc->sz, sizeof(struct address), cmp);
}
void killpeople(struct contact* pc)
{
  free(pc->date);
  pc->date = NULL;
  pc->max = 0;
  pc->sz = 0;
}
void speople(struct contact* pc)
{
  FILE* pf = fopen("test.dat", "wb");
  if (pf==NULL)
  {
    perror("fopen");
  }
  // 写数据
  int i;
  for ( i = 0; i <pc->sz; i++)
  {
    fwrite(pc->date + i, sizeof(struct address), 1, pf);
  }
  printf("保存成功");
  fclose(pf);
  pf = NULL;
}


以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够


不吝赐教 在评论区或者私信指正 博主一定及时修正


那么大家下期再见咯

相关文章
|
5天前
通讯录项目
通讯录项目
8 1
|
1月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
33 3
|
4月前
|
C++
【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码
【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码
|
4月前
通讯录的文件版本(又又又完善)
通讯录的文件版本(又又又完善)
24 0
|
5月前
文件版本的通讯录
文件版本的通讯录
50 1
|
5月前
|
C++
C++基础学习:通讯录管理系统(持续更新)
C++基础学习:通讯录管理系统(持续更新)
|
11月前
|
存储 C语言
【C语言课程设计】通讯录(1.0版本)
【C语言课程设计】通讯录(1.0版本)
55 0
|
11月前
|
C语言
【C语言课程设计】通讯录(3.0版本)
【C语言课程设计】通讯录(3.0版本)
68 0
|
11月前
|
C语言
【C语言课程设计】通讯录(2.0版本)
【C语言课程设计】通讯录(2.0版本)
48 0
|
Python
项目编写:通讯录
本文通过python语言,进行通讯录项目的编写。
94 1