C语言实现通讯录(文件版)

简介: C语言实现通讯录(文件版)

C语言实现通讯录(文件版)


一、学习完C语言文件,可以增加通讯录的以下功能

学习完C语言的文件读写,我们又可以将通讯录增加以下功能:

1.当退出通讯录的时候,把已增加的联系人信息写到文件中。

2.当通讯录初始化的时候,加载(读取)文件里的信息到通讯录 ——(直接使用打印函数可以显示在屏幕上)


二、分析和实现相应函数

分析:

  1. 当我们退出通讯录的时候要实现通讯录的保存功能 (实现保存通讯录联系人信息到Contact.dat文件)——SaveContact
  2. 当我们再次运行通讯录并对通讯录进行增删查改的时候,我们就应该要实现将文件中的信息输出到运行框中显示出来——LoadContact

3.当我们实现LoadContact函数的时候,发现要在初始化通讯录函数中就要调用加载函数LoadContact

4.在使用LoadContact函数的时候,发现会有问题——如果文件中联系人的个数大于3(capacity),这时我们将文件读取到程序中这时发现就无法显示文件中所有人的信息。这时我们就要在LoadContact函数中先扩容,再读取。

5.我们发现很多地方要利用扩容,所以我们干脆实现一个扩容函数。

实现:

初始化函数中调用LoadContact

void InitContact( Contact* ps)
{
  assert(ps);
  ps->data = (PeoInfo*)malloc(default_sz * sizeof(PeoInfo));
  if (ps->data == NULL)
  {
    perror("InitContact");
    return;
  }
  ps->size = 0;
  ps->capacity = default_sz;
  //把文件中已经存放的通讯录中的信息加载到通讯录中
  LoadContact(ps);
}

SaveContact函数(保存联系人信息到文件)

SaveContact(Contact* ps)
{
  assert(ps);
  //打开文件,以写的形式打开--(没有contact.dat的文件会自动创建一个)
  FILE* pf = fopen("Contact.dat", "w");
  if (pf == NULL)
  {
    perror("SaveContact");
    return;
  }
  //写文件
  int i = 0;
  for (i = 0; i < ps->size; i++)
  {
    fwrite(ps->data + i, sizeof(PeoInfo), 1, pf);
  }
  //关闭文件
  fclose(pf);
  pf = NULL;
}

SaveContact函数(保存联系人信息到文件)

SaveContact(Contact* ps)
{
  assert(ps);
  //打开文件,以写的形式打开--(没有contact.dat的文件会自动创建一个)
  FILE* pf = fopen("Contact.dat", "w");
  if (pf == NULL)
  {
    perror("SaveContact");
    return;
  }
  //写文件
  int i = 0;
  for (i = 0; i < ps->size; i++)
  {
    fwrite(ps->data + i, sizeof(PeoInfo), 1, pf);
  }
  //关闭文件
  fclose(pf);
  pf = NULL;
}

LoadContact函数(读取文件信息到通讯录)

void LoadContact(Contact* ps)
  {
    FILE* pf = fopen("Contact.dat", "r");
    if (pf== NULL)
    {
      printf("LoadContact:");
      return;
    }
    //读取文件,存放到通讯录中
    PeoInfo tmp = { 0 };
    while (fread(&tmp, sizeof(PeoInfo), 1, pf))
    {
      CheckCapacity(ps);//要设置扩容(调用扩容函数)
      ps->data[ps->size] = tmp;
      ps->size++;
    }
    fclose(pf);
    pf = NULL;
  }

检查扩容函数

void CheckCapacity(struct Contact* ps)
{
  assert(ps);
  if (ps->size == ps->capacity)
  {
    //增容
    struct PeoInfo* ptr = realloc(ps->data, (ps->capacity + 2) * sizeof(PeoInfo));
    if (ptr != NULL)
    {
      ps->data = ptr;
      ps->capacity += 2;
      printf("增容成功\n");
    }
    else
    {
      printf("增容失败\n");
    }
  }
}


三、 程序运行结果

直接选择5,显示之前的联系人信息

相关文章
|
12天前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
17 2
|
19天前
|
C语言
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
|
19天前
|
存储 C语言
【C语言】探索文件读写函数的全貌(二)
【C语言】探索文件读写函数的全貌
|
17天前
|
存储 C语言
手把手教你用C语言实现通讯录管理系统
手把手教你用C语言实现通讯录管理系统
|
19天前
|
C语言
【C语言】探索文件读写函数的全貌(一)
【C语言】探索文件读写函数的全貌
|
19天前
|
存储 文件存储 C语言
【C语言】深入了解文件:简明指南
【C语言】深入了解文件:简明指南
|
1月前
|
Linux C语言
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。
|
2月前
|
存储 C语言
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
|
2月前
|
存储 自然语言处理 程序员
【C语言】文件的编译链接和预处理
【C语言】文件的编译链接和预处理
|
2月前
|
存储 C语言
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】