C語言實現一個簡易通訊錄
阿新 • • 發佈:2020-07-24
本文實現一個通訊錄,是基於c語言的IO檔案操作、資料結構裡面的順序表實現。
具體功能
實現了
1、資訊的新增
2、資訊的顯示
3、資訊的修改(修改單一屬性)
4、將記憶體中的資訊儲存到檔案中去
5、將檔案中的資訊載入到記憶體中(每次程式執行資料就會丟失)
6、資訊的刪除
7、資訊的查詢(按照各自的屬性查詢)
8、給每一條資訊設定了唯一的標識id
9、通訊錄的銷燬
標頭檔案中的宣告
在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,SEEK_END); // 從游標到檔案首偏移的位元組數 len = ftell(fp); if(len == 0) { printf("通訊錄為空\n\n"); return ; } // rewind函式是將fp指標指向檔案的開始 rewind(fp); while(!feof(fp)) { fscanf(fp,&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",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",book->data[i].address); } i++; } if(flag == 0) { printf("未查詢到\n"); } } else { printf("選擇錯誤\n"); } } /*fseek(fp,100L,0);把檔案內部指標移動到離檔案開頭100位元組處; fseek(fp,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,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; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。