用C語言實現通訊錄文件存儲的版本

要實現文件存儲,首先需要了解幾個函數

  1. fopen :FILE *fopen( const char *filename, const char *mode );
    作用:fopen函數打開指定的文件文件名。;參數filename字符串表示打開文件的文件名。參數mode字符串表示打開方式;
    今天我們用到了兩個打開方式: “r+”和“w”
    “r+”:打開對閱讀和寫作。該文件必須存在。(這裏也可以用”r”);
    “w”:讀寫打開一個空文件。如果給定的文件存在,它的內容被破壞。
  2. fprintf 和 fscanf
    int fprintf( FILE *stream, const char *format [, argument ]…);
    int fscanf( FILE *stream, const char *format [, argument ]… );
    用法和printf(fscanf)其實相同,只是前面加了一個文件結構體指針stream,把在在鍵盤上讀換成文件中讀,把往屏幕上寫換成往文件中寫。

    介紹完我們使用的函數,先介紹下我的思想:
    這裏寫圖片描述

    代碼有三個文件項組成:
    adder.h
    adder.c
    test.c

//adder.h 這裏面就是定義了一些常量,和函數
#ifndef __ADDER_H__
#define __ADDER_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define MAX_CON  2
#define MAX_name 20
#define MAX_sex  7
#define MAX_tele 15
#define MAX_add  20
typedef struct Contacts
{
    char name[MAX_name];
    char sex[MAX_sex];
    int age;
    char tele[MAX_tele];
    char add[MAX_add];
}Contacts;
typedef struct Pcon
{
    int MAX_data;
    int sz;
    Contacts *adder;
}Pcon;
void read_exe(Pcon *Pconer);//讀取文件中數據
void Add_contact(Pcon* pconer);//增添聯繫人
void Del_contact(Pcon* pconer);//刪除聯繫人
void Find_contact(Pcon* pconer);//查找聯繫人
void Mod_contact(Pcon* pconer);//刪除聯繫人
void Acc_contact(Pcon* pconer);//修改聯繫人
void Remov_contact(Pcon* pconer);//清除通訊錄
void Sort_contact(Pcon* pconer);//按姓名排序通訊錄
void write_exe(Pcon *Pconer);//退出程序前寫入文件中
#endif //__ADDRE_H__
//test.c
#include "adder.h"

void memu()
{
    printf("**************************************************************\n");
    printf("********************     通訊錄選項     **********************\n");
    printf("  1.    添加聯繫人信息               2    刪除指定聯繫人信息\n");
    printf("  3.    查找指定聯繫人信息           4.   修改指定聯繫人信息\n");
    printf("  5.    顯示所有聯繫人信息           6.   清除所有聯繫人信息\n");
    printf("  7.    以名字排序所有聯繫人信息     0.   退出通訊錄        \n");
    printf("**************************************************************\n");
    printf("**************************************************************\n");
}

int main()
{
    int number = 0;
    void (*fun[8])(Pcon *)  = { NULL,Add_contact, 
                  Del_contact, Find_contact,
                 Mod_contact, Acc_contact, 
                Remov_contact,Sort_contact};
    Pcon Pconer; //創建結構體,保存通訊錄人數,大小,內容
    read_exe(&Pconer); //函數讀數據
    do
    {
        memu();
        scanf("%d",&number);
        if(number == 0)
            break;
        else if(number < 8)
            fun[number](&Pconer);
        else
        {
            printf("輸入有誤:>");
        }
    }while(1);
    write_exe(&Pconer); //寫數據
    return 0;
}
//adder.c
#include "adder.h"
void INIT(Pcon *Pconer)
{
    Pconer->adder = (Contacts *)malloc(sizeof(Contacts)*MAX_CON);
    if(Pconer->adder == NULL)
    {
        perror("use malloc ");
        exit(1);
    }
    Pconer->sz  = 0;
    Pconer->MAX_data = MAX_CON;
}
void read_exe(Pcon *Pconer) //讀取數據
{
    FILE *pf = fopen("adder.txt", "r+");
    int i = 0;
    fscanf(pf, "%d %d" , &(Pconer->sz), &(Pconer->MAX_data));//我們首先讀出文件中存儲了多少個聯繫人
    //這裏解釋爲什麼一開始我們創建文件時要初始化 0 0
    //第一次使用時,若沒有初始化讀取數據時就會讀取錯誤
    if(Pconer->MAX_data == 0)
    {
        INIT(Pconer);
    }
    else
    {
        Pconer->adder = (Contacts *)malloc(sizeof(Contacts)*(Pconer->MAX_data));
    }
    if(Pconer->adder == NULL)
    {
        perror("use malloc ");
        exit(1);
    }
    for(i=0;i<(Pconer->sz);i++)
    {
        fscanf(pf,"%s %s %d %s %s",Pconer->adder[i].name,Pconer->adder[i].sex,(&Pconer->adder[i].age),
            Pconer->adder[i].tele,Pconer->adder[i].add);
    }
    fclose(pf);
}
void check_adder(Pcon **pconer) //判斷內存是否已滿,若滿了則增加空間
{
    if((*pconer)->sz >= (*pconer)->MAX_data )
    {
        (*pconer)->adder = (Contacts *)realloc((*pconer)->adder, sizeof(Contacts)*((*pconer)->MAX_data+MAX_CON));
        (*pconer)->MAX_data += MAX_CON;
        printf("空間增加成功\n");
    }
}
void Add_contact(Pcon *pconer) //1.添加聯繫人;
{
    check_adder(&pconer);
    printf("請輸入聯繫人姓名:> ");
    scanf("%s",(pconer->adder[pconer->sz]).name);
    printf("請輸入聯繫人性別:> ");
    scanf("%s",(pconer->adder[pconer->sz]).sex);
    printf("請輸入聯繫人年齡:> ");
    scanf("%d",&((pconer->adder[pconer->sz]).age));
    printf("請輸入聯繫人電話號碼:> ");
    scanf("%s",(pconer->adder[pconer->sz]).tele);   
    printf("請輸入聯繫人住址:> ");
    scanf("%s",(pconer->adder[pconer->sz]).add);
    ++pconer->sz;
    printf("添加完成\n");
}
void Del_contact(Pcon* pconer) //2.刪除指定聯繫人
{
    int i = 0;
    char buf[MAX_name]= {0};
    printf("請輸入刪除的聯繫人名:> ");
    scanf("%s",buf);
    while(i<pconer->sz)
    {
        if(strcmp(buf,(pconer->adder[i]).name) == 0)
            break;
        i++;
    }
    if(i == pconer->sz)
    {
        printf("無此人信息!\n");
        return;
    }
    while(i<pconer->sz)
    {
        pconer->adder[i] = pconer->adder[i+1];
        ++i;
    }
    --pconer->sz;
}
void Find_contact(Pcon* pconer)//3.查找聯繫人
{
    int i = 0;
    char buf[MAX_name];
    scanf("%s",buf);
    while(i<pconer->sz)
    {
        if(strcmp(buf,pconer->adder[i].name) == 0)
            break;
        ++i;
    }
    if(i == pconer->sz)
    {
        printf("無此人信息!\n");
        return;
    }
    printf("姓名:%-10s, 性別:%-5s,年齡:%-4d, 電話:%15-s, 住址:%20-s\n",
        pconer->adder[i].name,pconer->adder[i].sex,
        pconer->adder[i].age,pconer->adder[i].tele,pconer->adder[i].add);

}
void Mod_contact(Pcon* pconer)//4.修改聯繫人
{
        int i = 0;
        int number = 0;
    char buf[MAX_name];
    scanf("%s",buf);
    while(i<pconer->sz)
    {
        if(strcmp(buf,pconer->adder[i].name) == 0)
            break;
        ++i;
    }
    if(i == pconer->sz)
    {
        printf("無此人信息!\n");
        return;
    }
    printf("修改項目:1 姓名 2 性別 3 年齡 4 電話 5 住址\n");
    scanf("%d",&number);
    printf("請輸入修改後的內容:");
    switch(number)
    {
    case 1:
        scanf("%s",pconer->adder[i].name);
        break;
    case 2:
        scanf("%s",pconer->adder[i].sex);
        break;
    case 3:
        scanf("%d",&pconer->adder[i].age);
        break;
    case 4:
        scanf("%s",pconer->adder[i].tele);
        break;
    case 5:
        scanf("%s",pconer->adder[i].add);
        break;
    }

}
void Acc_contact(Pcon* pconer) //5.顯示所有聯繫人
{
    int i = 0;
    for(i=0; i<pconer->sz; ++i)
    {
    printf("姓名:%-10s性別:%-5s年齡:%-4d電話:%-15s住址:%-20s\n",
        pconer->adder[i].name,pconer->adder[i].sex,
        pconer->adder[i].age,pconer->adder[i].tele,pconer->adder[i].add);
    }

}

void Remov_contact(Pcon* pconer)//6.清除所有聯繫人信息
{
    pconer->sz = 0;
}

int compare(const void *str1, const void* str2) //qsort 排序
{
    return strcmp( ((Contacts *)str1)->name,((Contacts *)str2)->name );
}
void Sort_contact(Pcon* pconer) //以名字排序通訊錄
{
    qsort((pconer->adder),pconer->sz,sizeof(Contacts),compare );    
}
void write_exe(Pcon *Pconer)
{
    FILE *pf = fopen("adder.txt", "w");
    int i = 0;
    fprintf(pf, "%d %d ", Pconer->sz, Pconer->MAX_data);
    for(i=0; i<Pconer->sz; i++)
    {
        fprintf(pf,"%s %s %d %s %s ",Pconer->adder[i].name,
        Pconer->adder[i].tele,Pconer->adder[i].add);
    }
    fclose(pf);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章