C语言实现简单电子通讯录(2)

2020-06-28 17:00:50于丽

主函数 main.c 加入了数据的读取和写入,已标明

/*******************************************************************
需求:制作一个电子通讯录,通过该通讯录能录入好友ID号、姓名(英文)、手
机号码,家庭住址,公司电话。
模块:
  主界面:主要显示软件功能,A)添加好友信息 B)列表好友信息。(包含排序
  功能) C)搜索好友 D)删除好友
  A)用户输入INSERT命令后,让用户输入好友信息。添加成功或失败都需提示
  B)用户输入DISPLAY命令后,好友信息升序排列
  C)用户输入SEARCH命令后,让用户输入将要搜索好友姓名查询。如果未搜索
  到请友好提示。如果搜索到,显示处该好友信息
  D)用户输入DELETE命令后,让用户输入将要删除好友姓名删除,如果存在同
  名的多个好友,则列表出,所有同名的好友信息,让用户通过输入ID号删除
  提示用户删除成功。
**********************************************************************/
#include "head.h"

int main ()
{
  int Function;
  int i = 0;
  char Name[N];
  int cho;

  // 创建头结点并为其分配空间
  PNode head_node = (PNode) malloc(sizeof(Node)/sizeof(char));
  if (NULL == head_node)
  {
    return MALLOC_ERROR;
  }
  head_node->next = NULL;


/****************************************************************
  打开存放信息的文件并将里面的数据导入到链表中区
****************************************************************/
  // 以只读方式打开存放信息的文件,
  FILE *fp1 = fopen ("student.txt", "r+"); 
  if (NULL == fp1) 
  { 
    printf ("fopen"); 
    return -1; 
  } 

  PNode tmp = head_node; 
  int count; 
  int ret; 

  // 保存读记录的个数并判断是否读到文件结尾,如果读到文件结尾,
  // 它返回一个非0 的值
  ret = fread (&count, sizeof(int), 1, fp1); 
  if(ret != 0) 
  { 
    for (i = 0; i < count; i++) 
    {
      // 创建新结点用来保存读取的数据
      Node *node = (Node*)malloc(sizeof(Node)/sizeof(char));   

      int len;          
      fread (&len, sizeof(int), 1, fp1);   // 读取数据长度
      fread (&(node->data), len, 1, fp1);   // 读取数据 

      node->next = NULL;   
      while (tmp->next)            // 向后遍历
      { 
        tmp = tmp->next; 
      } 
      tmp->next = node;            // 将结点导入链表中 
    } 
  } 

  if (ret == 0 && !feof(fp1))           // 读取失败
  { 
    perror ("fread"); 
    return -1; 
  } 
  fclose (fp1);                  // 关闭刚刚打开的文件
/****************************************************************
  文件导入链表结束,关闭文件
****************************************************************/  

  i = 1;               // i初始化(i既是ID编号)
  while (1)
  {
    Interface_Display ();      // 主界面
    scanf ("%d", &Function);

    switch (Function)        // 功能选择
    {
      case 1:           // 添加好友
      {
        Function = 0;
        Add_Friend (head_node, i++);
        int j;

        printf ("t正在添加n");
        printf ("t请稍候");
        fflush (stdout);    // 强制刷新缓存,输出显示
        for (j = 0; j < 2; j++)
        {
          sleep (1);     // Linux 使用sleep,参数为秒
          printf (".");
          fflush (stdout);  // 强制刷新缓存,输出显示
        }
        printf ("n");
        printf ("t添加成功!n");
        printf ("t返回主菜单请输入1:");
        scanf ("%d", &cho);
        if (1 == cho)
        {
          break;
        }
        else
        {
          printf ("t对不起!您的输入有误!请重新输入:");
          scanf ("%d", &cho);
          break;
        }
        break;
      }      
      case 2:         // 显示好友信息
      {
        system ("clear");
        printf ("t***********好友信息******************n");
        printf ("n");

        Friend_Information (head_node);
        Function = 0;
        printf ("t返回主菜单请输入1:");
        scanf ("%d", &cho);
        if (1 == cho)
        {
          break;
        }
        else
        {
          printf ("t对不起!您的输入有误!请重新输入:");
          scanf ("%d", &cho);
          break;
        }
        break;
      }
      case 3:         // 查找好友
      {
        system ("clear");
        printf ("t*************查找好友*************n");
        printf ("t请输入您要查找的好友姓名:");
        scanf ("%s", Name);
        printf ("n");

        int j;     
        printf ("t正在查找n");
        printf ("t请稍候");
        fflush (stdout);    // 强制刷新缓存,输出显示
        for (j = 0; j < 2; j++)
        {
          sleep (1);     // Linux 使用sleep,参数为秒
          printf (".");
          fflush (stdout);  // 强制刷新缓存,输出显示
        }
        printf ("n");
        Search_Friend (head_node, Name);
        printf ("t返回主菜单请输入1:");
        scanf ("%d", &cho);
        if (1 == cho)
        {
          break;
        }
        else
        {
          printf ("t对不起!您的输入有误!请重新输入:");
          scanf ("%d", &cho);
          break;
        }
        break;
      }
      case 4:           //删除好友
      {
        system ("clear");
        printf ("t*************删除好友*************n");
        printf ("t请输入要删除好友的姓名:");
        scanf ("%s", Name);
        printf ("n");
        Delete_Friend (head_node, Name);
        printf ("t返回主菜单请输入1:");
        scanf ("%d", &cho);
        if (1 == cho)
        {
          break;
        }
        else
        {
          printf ("t对不起!您的输入有误!请重新输入:");
          scanf ("%d", &cho);
          break;
        }
        break;
      }  
      case 5:           //退出通讯录
      {

/****************************************************************
        退出程序前,将链表中的数据导入到文件中去
****************************************************************/
        // 以更新方式打开存放信息的文件(打开时会清空文件)
        FILE *fp2 = fopen ("student.txt", "wb+"); 
        if(NULL == fp2) 
        { 
          printf ("fopen"); 
          return -1; 
        } 

        tmp = head_node->next;     // tmp为第一个结点
        count = 0;           // 用来存放链表长度
        while(tmp)           // 求链表长度
        { 
          count++; 
          tmp = tmp->next; 
        }

        // 要写入数据的个数
        fwrite(&count, sizeof(int), 1, fp2); 
        tmp = head_node;        // tmp初始化
        while (tmp->next) 
        { 
          Node* p = tmp->next; 
          tmp->next = p->next; 

          // 写入数据的长度         
          int len = sizeof(p->data); 
          fwrite (&len, sizeof(int), 1, fp2); 

          //写入数据 
          fwrite (&(p->data), sizeof(Data), 1, fp2); 

          free (p);          
        } 
        fclose (fp2); 
/****************************************************************
        数据保存结束,即将退出程序
****************************************************************/

        Function = 0;
        system ("clear");
        exit (0);
      }
      default:          //输入有误
      {
        Function = 0;
        printf ("t对不起!您的输入有误!请重新输入:");
        scanf ("%d", &Function);
        break;
      }      
    }    
  }  

  return 0;
}