时间:2021-04-06 10:03:07 | 栏目:C代码 | 点击:次
本文实现一个通讯录,是基于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,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; }