通訊錄
實現通訊錄,是基於c語言的IO文件操作、數據結構裏面的順序表實現。
具體功能
實現了
- 信息的添加
- 信息的顯示
- 信息的修改(修改單一屬性)
- 將內存中的信息保存到文件中去
- 將文件中的信息加載到內存中(每次程序運行數據就會丟失)
- 信息的刪除
- 信息的查找(按照各自的屬性查找)
- 給每一條信息設置了唯一的標識id
- 通訊錄的銷燬
頭文件中的聲明
在c語言中我們採用結構體來記錄每一個人的具體信息
用順序表的數據結構來來對數據的操作
#ifndef __ADDRESSBOOK_H__
#define __ADDRESSBOOK_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#define NAME_MAX 200 //名字
#define GENDER_MAX 100 // 性別
#define ADDRESS_MAX 200 // 地址
#define NUMBER_MAX 200 // 電話
#define SEQLIST_MAX 1000 // 存儲的最大信息數量
#define FILE_PATH "address_book.txt" // 寫入文件的位置
typedef struct person_inf
{
char name[NAME_MAX];
char gender[GENDER_MAX];
char number[NUMBER_MAX];
char address[ADDRESS_MAX];
}person_inf;
typedef struct address_book
{
size_t size;
person_inf data[SEQLIST_MAX];
}address_book;
//初始化通訊錄
void address_book_init(address_book *book);
//添加信息
void address_book_add(address_book *book);
//顯示信息
void address_book_display(address_book *book);
//刪除所有信息
void address_book_delete_all(address_book *book);
//保存信息
void address_book_save(address_book *book);
//加載信息
void address_book_load(address_book *book);
//修改信息
void address_book_update(address_book *book);
//刪除信息
void address_book_delete(address_book *book);
//查找信息
void address_book_find(address_book *book);
//銷燬通訊錄
void adderss_book_destory(address_book *book);
#endif
函數的定義
在這裏我們實現了,基本的增刪查改,保存信息加載信息。
#define _CRT_SECURE_NO_WARNINGS
#include "AddressBook.h"
//初始化通訊錄
void address_book_init(address_book *book)
{
if(book == NULL)
{
return ;
}
book->size = 0;
}
//添加信息
void address_book_add(address_book *book)
{
size_t cur = 0;
if(book == NULL)
{
printf("book is NULL\n");
return ;
}
cur = book->size;
++book->size;
printf("添加信息\n");
printf("請輸入要添加的姓名\n");
scanf("%s",book->data[cur].name);
printf("請輸入要添加的性別\n");
scanf("%s",book->data[cur].gender);
printf("請輸入要添加的電話\n");
scanf("%s",book->data[cur].number);
printf("請輸入要添加的地址\n");
scanf("%s",book->data[cur].address);
printf("添加成功\n");
return;
}
//顯示信息
void address_book_display(address_book *book)
{
size_t j = 0;
if(book == NULL)
{
return ;
}
printf("序號\t\t姓名\t\t性別\t\t電話\t\t地址\n");
for(j=0; j< book->size; j++)
{
printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",j,book->data[j].name,
book->data[j].gender,book->data[j].number,
book->data[j].address);
}
}
//保存信息
void address_book_save(address_book *book)
{
size_t i = 0;
FILE *fp = fopen(FILE_PATH,"w");
if(book == NULL)
{
return ;
}
if(fp == NULL)
{
printf("打開文件失敗\n");
return ;
}
//fprintf(fp,"序號\t\t姓名\t\t性別\t\t電話\t\t地址\n");
for(i=0; i< book->size; i++)
{
fprintf(fp,"%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name,
book->data[i].gender,book->data[i].number,
book->data[i].address);
}
fclose(fp);
}
//加載信息
void address_book_load(address_book *book)
{
size_t len = 0;
size_t i = 0;
FILE *fp = fopen(FILE_PATH,"r");
if(book == NULL)
{
return ;
}
if(fp == NULL)
{
printf("打開文件失敗\n");
return ;
}
// 把光標移動到文件末尾
fseek(fp,0,SEEK_END);
// 從光標到文件首偏移的字節數
len = ftell(fp);
if(len == 0)
{
printf("通訊錄爲空\n\n");
return ;
}
// rewind函數是將fp指針指向文件的開始
rewind(fp);
while(!feof(fp))
{
fscanf(fp,"%u\t\t%s\t\t%s\t\t%s\t\t%s\n",&i,book->data[book->size].name,//name是數組,在調用數組名時候降級爲指針
book->data[i].gender,book->data[book->size].number,
book->data[book->size].address);
i++;
++book->size;
}
fclose(fp);
}
//修改信息
void address_book_update(address_book *book)
{
size_t i = 0;
if(book == NULL)
{
return ;
}
printf("請輸入要修改的編號\n");
scanf("%u",&i);
if(i > book->size || i < 0)
{
printf("輸入爲非法值\n");
return ;
}
printf("修改信息\n");
printf("姓名修改爲\n");
scanf("%s",book->data[i].name);
printf("性別修改爲\n");
scanf("%s",book->data[i].gender);
printf("修改電話爲\n");
scanf("%s",book->data[i].number);
printf("地址修改爲\n");
scanf("%s",book->data[i].address);
printf("修改成功\n");
return ;
}
//刪除信息
void address_book_delete(address_book *book)
{
size_t i = 0;
if(book == NULL)
{
return ;
}
printf("請輸入要刪除的編號\n");
scanf("%u",&i);
if(i > book->size)
{
printf("輸入爲非法值\n");
return ;
}
while(i < book->size)
{
book->data[i] = book->data[i+1];
i++;
}
book->size--;
printf("刪除成功\n");
return;
}
//刪除所有信息
void address_book_delete_all(address_book *book)
{
if(book == NULL)
{
return ;
}
book->size = 0;
}
//查找信息
void address_book_find(address_book *book)
{
int flag = 0;
size_t i = 0;
int choice = 0;
char f_name[50];
char f_number[50];
if(book == NULL)
{
//book爲空指針;
return ;
}
printf("請輸入要查找的方式\n");
printf("************************\n");
printf("*1.姓名查找 2.電話號查找\n");
printf("************************\n");
scanf("%d",&choice);
if (choice == 1)
{
//姓名查找
printf("請輸入查找的姓名或者關鍵字\n");
scanf("%s",f_name);
printf("序號\t\t姓名\t\t性別\t\t電話\t\t地址\n");
while(i < book->size)
{
if(strstr(book->data[i].name,f_name)) //用strstr函數來查關鍵字
{
flag = 1;
printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name,
book->data[i].gender,book->data[i].number,
book->data[i].address);
}
i++;
}
if(flag == 0)
printf("未查找到\n");
}
else if (choice == 2)
{
//電話號碼查找
printf("請輸入查找的電話號或者關鍵號碼\n");
scanf("%s",f_number);
printf("序號\t\t姓名\t\t性別\t\t電話\t\t地址\n");
while(i < book->size)
{
if(strstr(book->data[i].number,f_number))
{
flag = 1;
printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name,
book->data[i].gender,book->data[i].number,
book->data[i].address);
}
i++;
}
if(flag == 0)
{
printf("未查找到\n");
}
}
else
{
printf("選擇錯誤\n");
}
}
/*fseek(fp,100L,0);把文件內部指針移動到離文件開頭100字節處;
fseek(fp,100L,1);把文件內部指針移動到離文件當前位置100字節處;
fseek(fp,-100L,2);把文件內部指針退回到離文件結尾100字節處。
ftell(fp);利用函數 ftell() 也能方便地知道一個文件的長。
如以下語句序列: fseek(fp, 0L,SEEK_END); len =ftell(fp)+1;
首先將文件的當前位置移到文件的末尾,然後調用函數ftell()獲得當前
位置相對於文件首的位移,該位移值等於文件所含字節數。
*/
//銷燬通訊錄
void adderss_book_destory(address_book *book)
{
FILE *fp = fopen(FILE_PATH,"w");
if(book == NULL)
{
return ;
}
if(fp == NULL)
{
printf("打開文件失敗\n");
return ;
}
fseek(fp,0,SEEK_SET);
rewind(fp);
fclose(fp);
printf("銷燬成功\n");
}
主函數的實現(主要的框架)
實現是採用枚舉來標識要使用哪種功能,其中要注意的是,我們在將程序運行起來時候就需要加載我們的以前文件中的信息。還有就是我們要在每次添加一條信息,或者刪除,修改都需要保存,既內存中和IO文件中保存寫入一次
enum
{
EXIT,
DISPLAY,
ADD,
UPDATE,
Y_DELETE,
FIND,
DESTORY
};
//菜單
void menu()
{
int choice = 0;
address_book book;
address_book_init(&book);
address_book_load(&book);
while(1)
{
printf("===============================\n");
printf("1.顯示通訊錄\n");
printf("2.添加\n");
printf("3.修改\n");
printf("4.刪除\n");
printf("5.查找\n");
printf("6.銷燬\n");
printf("0.退出\n");
printf("===============================\n");
scanf("%d",&choice);
system("cls");
switch (choice)
{
case DISPLAY:
address_book_display(&book);
break;
case ADD:
address_book_add(&book);
address_book_save(&book);
break;
case UPDATE:
address_book_update(&book);
address_book_save(&book);
break;
case Y_DELETE:
address_book_delete(&book);
address_book_save(&book);
break;
case FIND:
address_book_find(&book);
break;
case DESTORY:
adderss_book_destory(&book);
address_book_delete_all(&book);
break;
case EXIT:
return ;
break;
default:
printf("輸入值非法\n");
break;
}
}
}
int main()
{
menu();
return 0;
}
如有錯誤,多多指正,謝謝!