国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言——通訊錄詳解(文件版)

這篇具有很好參考價值的文章主要介紹了C語言——通訊錄詳解(文件版)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

前言:

我們已經(jīng)掌握了通訊錄的靜態(tài)版和動態(tài)版,下面我們將學(xué)習(xí)通訊錄的文件版。學(xué)習(xí)了文件版,我們就不用擔(dān)心退出程序后,已經(jīng)添加的聯(lián)系人清空了。在以前的通訊錄(通訊錄靜態(tài)版、通訊錄動態(tài)版)基礎(chǔ)上,我們在完成兩個目標(biāo)就可以實(shí)現(xiàn)通訊錄文件版。
目標(biāo):

  1. 通訊錄退出程序前,把添加的聯(lián)系人寫入文件里。
  2. 通訊錄初始化的時候,把文件里的聯(lián)系人信息讀到程序里。

一、保存通訊錄

void Preservecontact(contact* pc)
{
    //打開文件
    FILE* pf = fopen("contact.txt", "wb");
    if (pf == NULL)
    {
        perrer("fopen");
        return;

    }
   //寫數(shù)據(jù)
    int i= 0;
    for (i = 0; i < pc->sz; i++)
    {
        fwrite(pc->data + i, sizeof(com), 1, pf);
    }
    //關(guān)閉文件
    fclose(pf);
    pf = NULL;
}

鼠標(biāo)右鍵彈出菜單->單擊打開所在文件夾
C語言——通訊錄詳解(文件版),C語言,c語言,java,數(shù)據(jù)庫

在所在文件夾下面生成了一個二進(jìn)制文件,保存的通訊錄聯(lián)系人在里面
C語言——通訊錄詳解(文件版),C語言,c語言,java,數(shù)據(jù)庫文章來源地址http://www.zghlxwxcb.cn/news/detail-705553.html

二、讀取通訊錄

2.1 通訊錄初始化

//通訊錄初始化
void initCantact(contact* pc)
{
    assert(pc);
    pc->data = (com*)malloc(3 * sizeof(com));
    if (pc->data == NULL)
    {
        perror("initCantact");
        return;
    }
    pc->sz = 0;
    pc->capacity = CONTACT_SZ;
    //文件中保存的信息加載到通訊錄里
    LoadContact(pc);
}

2.2 將文件的信息加載到通訊錄

//增容函數(shù)的聲明
int Addcapacity(contact* pc);
//  //文件中保存的信息加載到通訊錄里
void  LoadContact(contact* pc)
{
    //打開文件
    FILE* pf = fopen("contact.txt", "rb");
    if (pf == NULL)
    {
        perror("fopen");
        return;
    }
    //讀文件
    com tmp = { 0 };
    while (fread(&tmp, sizeof(com),1, pf))
    {
        //增容函數(shù)
        Addcapacity(pc);
        pc->data[pc->sz] = tmp;
        pc->sz++;
    }
    //關(guān)閉文件
    fclose(pf);
    pf = NULL;
}

三、代碼展示

3.1通訊錄的聲明和定義(contct.h)

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define MAX 100//可以增加的人數(shù)
#define NAME_MAX 20//姓名
#define SEX_MAX 5//性別
#define TELE_MAX 12//電話
#define ADDR_MAX 20//地址
#define CONTACT_SZ 3//初始容量
#define INT_sz 3//一次增容的大小
//定義一個結(jié)構(gòu)體
typedef struct Communication
{
    char name[NAME_MAX];//姓名
    int age;//年齡
    char sex[SEX_MAX];//性別
    char tele[TELE_MAX];//電話
    char addr[ADDR_MAX];//地址
}com;
//定義一個通訊錄
typedef struct Comcation
{
    com* data;//可以存100個人的信息
    int sz;//記錄存放人的位置
    int capacity;//記錄容量
}contact;
//給通訊錄賦初值
void initCantact(contact* pc);
//增容函數(shù)
int Addcapacity(contact* pc);
//菜單
void menu(void);
//增加聯(lián)系人
void Addcontact(contact* pc);
//顯示聯(lián)系人
void Showcontact(const contact* pc);
//刪除聯(lián)系人
void Delcontact(contact* pc);
//查找聯(lián)系人
int Findcontact(contact* pc, char arr[20]);
//查找指定聯(lián)系人
void Searchcontact(contact* pc);
//修改聯(lián)系人
void Modfycontatc(contact* pc);
//聯(lián)系人按名字進(jìn)行排序
void Sortcontact(contact* pc);
//清空聯(lián)系人
void Emptycontact(contact* pc);
//釋放內(nèi)存
void Destorycontacy(contact* pc);
//保存聯(lián)系人
void Preservecontact(contact* pc);


3.2通訊錄函數(shù)的實(shí)現(xiàn)(contact.c)

#include "contact.h"
//增容函數(shù)
int Addcapacity(contact* pc);
//  //文件中保存的信息加載到通訊錄里
void  LoadContact(contact* pc)
{
    //打開文件
    FILE* pf = fopen("contact.txt", "rb");
    if (pf == NULL)
    {
        perror("fopen");
        return;
    }
    //讀文件
    com tmp = { 0 };
    while (fread(&tmp, sizeof(com),1, pf))
    {
        //增容函數(shù)
        Addcapacity(pc);
        pc->data[pc->sz] = tmp;
        pc->sz++;
    }
    //關(guān)閉文件
    fclose(pf);
    pf = NULL;
}
//通訊錄初始化
void initCantact(contact* pc)
{
    assert(pc);
    pc->data = (com*)malloc(3 * sizeof(com));
    if (pc->data == NULL)
    {
        perror("initCantact");
        return;
    }
    pc->sz = 0;
    pc->capacity = CONTACT_SZ;
    //文件中保存的信息加載到通訊錄里
    LoadContact(pc);
}
//增容函數(shù)
int Addcapacity(contact* pc)
{
    if (pc->sz == pc->capacity)//容量滿了就增容
    {
        com* ptr = (com*)realloc(pc->data, (pc->capacity + INT_sz) * sizeof(com));
        if (ptr == NULL)
        {
            perror("Addcapacity");
            return 0;
        }
        else
        {
            pc->data = ptr;
            pc->capacity = pc->capacity + INT_sz;
            printf("增容成功\n");
            return 1;
        }
    }
    return 1;
}
//增加聯(lián)系人
void Addcontact(contact* pc)
{
    assert(pc);
    int n = Addcapacity(pc);
    if (0 == n) //增容
    {
        //增容失敗
        return;
    }

    printf("請輸入名字:");
    scanf("%s", pc->data[pc->sz].name);
    printf("請輸入年齡:");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("請輸入性別:");
    scanf("%s", pc->data[pc->sz].sex);
    printf("請輸入電話號碼:");
    scanf("%s", pc->data[pc->sz].tele);
    printf("請輸入地址:");
    scanf("%s", pc->data[pc->sz].addr);
    pc->sz++;
    printf("成功增加聯(lián)系人\n");
}
//顯示聯(lián)系人
void Showcontact(const contact* pc)
{
    assert(pc);
    printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n\n", "名字", "年齡", "性別", "電話", "地址");
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
            pc->data[i].name,
            pc->data[i].age,
            pc->data[i].sex,
            pc->data[i].tele,
            pc->data[i].addr);
    }
}
//查找聯(lián)系人
int Findcontact(contact* pc, char arr[20])
{
    int i = 0;

    for (i = 0; i < pc->sz; i++)
    {
        if (strcmp(pc->data[i].name, arr) == 0)//找到了
        {
            return i;
        }
    }
    return -1;//沒找到
}
//刪除聯(lián)系人
void Delcontact(contact* pc)
{
    if (pc->sz == 0)
    {
        printf("沒有聯(lián)系人,無需刪除\n");
        return;
    }
    char arr[20] = { 0 };
    assert(pc);
    printf("請輸入要刪除的人的名字:");
    scanf("%s", arr);//名字
    int n;
    n = Findcontact(pc, arr);
    if (n == -1)
    {
        printf("沒找到\n");
        return;
    }
    else//找到了
    {
        int i = 0;
        for (i = n; i < pc->sz - 1; i++)//從當(dāng)前位置開始,把后面的值都往前面挪一位
        {
            pc->data[i] = pc->data[i + 1];
        }
        pc->sz--;
    }
    printf("成功刪除聯(lián)系人\n");
}
//查找指定聯(lián)系人
void Searchcontact(contact* pc)
{
    assert(pc);
    char p[20] = { 0 };
    printf("請輸入要查找人的姓名:");
    scanf("%s", p);
    int n = Findcontact(pc, p);
    if (n == -1)
    {
        printf("要查找的人不存在\n");
    }
    else
    {
        printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");
        //打印數(shù)據(jù)
        printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
            pc->data[n].name,
            pc->data[n].age,
            pc->data[n].sex,
            pc->data[n].tele,
            pc->data[n].addr);
    }
}
//修改聯(lián)系人
void Modfycontatc(contact* pc)
{
    assert(pc);
    char name[20] = { 0 };
    if (pc->sz == 0)
    {
        printf("沒有聯(lián)系人,無需修改\n");
        return;
    }
    printf("請輸入要修改人的名字;");
    scanf("%s", name);
    int n = 0;
    n = Findcontact(pc, name);
    if (n == -1)
    {
        printf("要修改的人不存在\n");
    }
    else
    {
        printf("請輸入修改后的名字:");
        scanf("%s", pc->data[n].name);
        printf("請輸入修改后的年齡:");
        scanf("%d", &(pc->data[n].age));
        printf("請輸入修改后的性別:");
        scanf("%s", pc->data[n].sex);
        printf("請輸入修改后的電話號碼:");
        scanf("%s", pc->data[n].tele);
        printf("請輸入修改后的地址:");
        scanf("%s", pc->data[n].addr);
        printf("修改成功\n");
    }
}
int comper(const void* p1, const void* p2)//字符比較
{
    return strcmp(((com*)((contact*)p1)->data)->name, ((com*)((contact*)p2)->data)->name);
}
//按名字進(jìn)行排序
void Sortcontact(contact* pc)
{
    qsort(pc, pc->sz, sizeof(pc->data[0]), comper);//快排
}
//清空聯(lián)系人
void Emptycontact(contact* pc)
{
    assert(pc);
    if (pc->sz == 0)
    {
        printf("聯(lián)系人為空,無需清空\n");
    }
    else
    {
        pc->sz = 0;
        printf("清空成功\n");
    }
}
//釋放通訊錄內(nèi)存
void Destorycontacy(contact* pc)
{
    free(pc->data);
    pc->data = NULL;
    pc->sz = 0;
    pc->capacity = 0;
}
//保存聯(lián)系人
void Preservecontact(contact* pc)
{
    //打開文件
    FILE* pf = fopen("contact.txt", "wb");
    if (pf == NULL)
    {
        perror("fopen");
        return;

    }
   //寫數(shù)據(jù)
    int i= 0;
    for (i = 0; i < pc->sz; i++)
    {
        fwrite(pc->data + i, sizeof(com), 1, pf);
    }
    //關(guān)閉文件
    fclose(pf);
    pf = NULL;
}

3.2 通訊錄的測試(test.c)

#include "contact.h"
//菜單
void menu(void)
{
    printf("————————————————————\n");
    printf("|***************************************|\n");
    printf("|*****1.增加聯(lián)系人     2.刪除聯(lián)系人*****|\n");
    printf("|*****3.修改聯(lián)系人     4.查找聯(lián)系人*****|\n");
    printf("|*****5.顯示所有聯(lián)系人 6.排序      *****|\n");
    printf("|*****7.清除所有聯(lián)系人 0.退出程序   ****|\n");
    printf("|***************************************|\n");
    printf("————————————————————\n");
}
int main()
{
    int input = 0;
    //通訊錄初始化
    contact pc;
    initCantact(&pc);
    do
    {
        menu();
        printf("請選擇:\n");
        scanf("%d", &input);//
        switch (input)
        {
        case 1:
            Addcontact(&pc);//增加聯(lián)系人
            break;
        case 2:
            Delcontact(&pc);//刪除聯(lián)系人
            break;
        case 3:
            Modfycontatc(&pc);//修改聯(lián)系人
            break;
        case 4:
            Searchcontact(&pc);//查找指定聯(lián)系人
            break;
        case 5:
            Showcontact(&pc);//顯示聯(lián)系人
            break;
        case 6:
            Sortcontact(&pc);//按名字進(jìn)行排序
            break;
        case 7:
            //清空所以聯(lián)系人
            Emptycontact(&pc);
            break;
        case 0:
            //保存聯(lián)系人
            Preservecontact(&pc);
            Destorycontacy(&pc);
            printf("退出程序\n");
            break;
        default:
            printf("輸入錯誤,重新輸入\n");
        }
    } while (input);
    return 0;
}

到了這里,關(guān)于C語言——通訊錄詳解(文件版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C語言實(shí)現(xiàn)通訊錄(文件版)

    C語言實(shí)現(xiàn)通訊錄(文件版)

    學(xué)習(xí)完C語言的文件讀寫,我們又可以將通訊錄增加以下功能: 1.當(dāng)退出通訊錄的時候,把已增加的聯(lián)系人信息寫到文件中。 2.當(dāng)通訊錄初始化的時候,加載(讀取)文件里的信息到通訊錄 ——(直接使用打印函數(shù)可以顯示在屏幕上) 分析: 當(dāng)我們退出通訊錄的時候要實(shí)現(xiàn)通訊錄

    2024年02月01日
    瀏覽(21)
  • 動態(tài)通訊錄——C語言【詳解+全部碼源】

    動態(tài)通訊錄——C語言【詳解+全部碼源】

    作者簡介: 辭七七,目前大一,正在學(xué)習(xí)C/C++,Java,Python等 作者主頁: 七七的個人主頁 文章收錄專欄: 進(jìn)階C語言,本專欄主要講解數(shù)據(jù)存儲,進(jìn)階指針,動態(tài)內(nèi)存管理,文件操作,程序環(huán)境和預(yù)處理等 歡迎大家點(diǎn)贊 ?? 收藏 ? 加關(guān)注哦!???? 我們之前以及寫過靜態(tài)版

    2023年04月21日
    瀏覽(25)
  • c語言:通訊錄管理系統(tǒng)(文件版本)

    c語言:通訊錄管理系統(tǒng)(文件版本)

    前言: 本通訊錄管理系統(tǒng)一共三個版本,除此文章以外還有如下倆個版本,大家可以根據(jù)需求自?。?基礎(chǔ)增刪查改功能版本 :c語言:通訊錄管理系統(tǒng)(增刪查改)-CSDN博客 動態(tài)分配內(nèi)存版本 :c語言:通訊錄管理系統(tǒng)(動態(tài)分配內(nèi)存版)-CSDN博客 ? ? ? ? 本文是在基礎(chǔ)的通

    2024年02月07日
    瀏覽(90)
  • 【C語言】——通訊錄(靜態(tài)-動態(tài)增長-文件儲存)

    【C語言】——通訊錄(靜態(tài)-動態(tài)增長-文件儲存)

    ? 目錄 前言: 一:整體框架 關(guān)于通訊錄結(jié)構(gòu)體的創(chuàng)建? 二:通訊錄的功能實(shí)現(xiàn)(靜態(tài)) 2.1初始化通訊錄 2.2增加聯(lián)系人 2.3打印通訊錄 2.4刪除聯(lián)系人 ?2.5?查找聯(lián)系人 2.6修改聯(lián)系人? 2.7排序聯(lián)系人 三:通訊錄優(yōu)化——動態(tài)內(nèi)存 ?3.1通訊錄的創(chuàng)建 3.2初始化通訊錄? 3.3增加聯(lián)系

    2024年02月07日
    瀏覽(20)
  • 【C語言】通訊錄3.0 (文件存儲版)

    【C語言】通訊錄3.0 (文件存儲版)

    通訊錄是一種記錄聯(lián)系人信息的工具,包括姓名、電話號碼、電子郵件地址、住址等。 文章的一二三章均于上一篇相同,可以直接看第四章改造內(nèi)容。 此通訊錄是基于通訊錄2.0(動態(tài)增長版)的基礎(chǔ)上進(jìn)行增加文件操作功能,請先看系列文章第二篇,再看本篇博客。 ******

    2024年02月14日
    瀏覽(20)
  • 靜態(tài)版通訊錄——C語言【詳解+全部碼源】

    靜態(tài)版通訊錄——C語言【詳解+全部碼源】

    前言: 我們用C語言實(shí)現(xiàn)一個可以存放100個人信息的通訊錄 每個人的信息包括: 姓名、性別、年齡、住址、電話 通訊錄的功能包括: 增加聯(lián)系人 刪除指定聯(lián)系人 查找指定聯(lián)系人 修改指定聯(lián)系人 顯示聯(lián)系人信息 排序聯(lián)系人(按照年齡/名字) 與我們之前的掃雷和三子棋項(xiàng)目

    2023年04月20日
    瀏覽(26)
  • 通訊錄詳解(靜態(tài)版,動態(tài)版,文件版)

    通訊錄詳解(靜態(tài)版,動態(tài)版,文件版)

    ??博客主頁:江池俊的博客 ?收錄專欄:C語言進(jìn)階之路 ??專欄推薦:?C語言初階之路 ?數(shù)據(jù)結(jié)構(gòu)探索?C語言刷題專欄 ??代碼倉庫:江池俊的代碼倉庫 ??歡迎大家點(diǎn)贊??評論??收藏? 前言 在現(xiàn)代社會中,通訊錄已經(jīng)成為了我們生活中不可或缺的一部分。無論是工作還

    2024年02月05日
    瀏覽(22)
  • C語言小項(xiàng)目——通訊錄高階(文件管理版)

    C語言小項(xiàng)目——通訊錄高階(文件管理版)

    通訊錄初階: 點(diǎn)這里 通訊錄中階: 點(diǎn)這里 contact.c test.c contact.c contact.h

    2024年02月17日
    瀏覽(22)
  • C語言進(jìn)階之文件操作及改造通訊錄

    C語言進(jìn)階之文件操作及改造通訊錄

    我們前面學(xué)習(xí)結(jié)構(gòu)體時,寫通訊錄的程序,當(dāng)通訊錄運(yùn)行起來的時候,可以給通訊錄中增加、刪除數(shù)據(jù),此時數(shù)據(jù)是存放在內(nèi)存中,當(dāng)程序退出的時候,通訊錄中的數(shù)據(jù)自然就不存在了,等下次運(yùn)行通訊錄程序的時候,數(shù)據(jù)又得重新錄入,如果使用這樣的通訊錄就很難受。

    2024年02月16日
    瀏覽(26)
  • C語言之通訊錄的實(shí)現(xiàn)(靜態(tài)版,動態(tài)版,文件版)

    C語言之通訊錄的實(shí)現(xiàn)(靜態(tài)版,動態(tài)版,文件版)

    個人主頁(找往期文章包括但不限于本期文章中不懂的知識點(diǎn)):?我要學(xué)編程(?_?)-CSDN博客 目錄 靜態(tài)通訊錄的實(shí)現(xiàn)邏輯? test.c:通訊錄的邏輯實(shí)現(xiàn) Contact.h:函數(shù)的聲明與頭文件的包含 Contact.c:函數(shù)的實(shí)現(xiàn)? 通訊錄源碼:? test.c: Contact.c: Contect.h: 動態(tài)版通訊錄? test.c: Co

    2024年04月13日
    瀏覽(57)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包