您的位置:首页 > 其它

文件存储实现通讯录

2016-05-21 16:24 381 查看
文件操作fopen函数用来打开一个文件,其调用的一般形式为:文件指针名=fopen(文件名,使用文件方式) 其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。 “使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。 文件使用方式 意 义 “rt” 只读打开一个文本文件,只允许读数据 “wt” 只写打开或建立一个文本文件,只允许写数据 “at” 追加打开一个文本文件,并在文件末尾写数据 “rb” 只读打开一个二进制文件,只允许读数据 “wb” 只写打开或建立一个二进制文件,只允许写数据 “ab” 追加打开一个二进制文件,并在文件末尾写数据“rt+” 读写打开一个文本文件,允许读和写 “wt+” 读写打开或建立一个文本文件,允许读写 “at+” 读写打开一个文本文件,允许读,或在文件末追加数 据 “rb+” 读写打开一个二进制文件,允许读和写 “wb+” 读写打开或建立一个二进制文件,允许读和写 “ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据 对于文件使用方式有以下几点说明: 1. 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是: r(read): 读 w(write): 写 a(append): 追加 t(text):文本文件,可省略不写 b(banary): 二进制文件 +: 读和写 2. 凡用“r”打开一个文件时,该文件必须已经存在, 且只能从该文件读出。 3. 用“w”打开的文件只能向该文件写入。 若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。 4. 若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。但此时该文件必须是存在的,否则将会出错。头文件
#define _CRT_SECURE_NO_WARNINGS 1#ifndef __CONTACT_H__#define __CONTACT_H__#include <stdio.h>#include <string.h>#include<stdlib.h>enum OP{EXIT,ADD,DEL,MODIFY,SEARCH,DISPLAY,SORT,CLEAR};#define NAME_MAX 20#define SEX_MAX 5#define TELE_MAX 12#define ADDR_MAX 25#define MAX 1000#define DEFAULT_SZ 3#define DEFAULT_INC 2typedef struct PerInfo{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];}PeoInfo;//typedef struct Contact//{//	PeoInfo data[MAX];//	int size;//}Contact,*Pcon;typedef struct contact{PeoInfo *data;int size;int capacity;}Contact,*Pcon;void init_contact(Pcon pcon);void _destory_contact(Pcon pcon);void _add_contact(Pcon pcon);void _display_contact(Pcon pcon);void _del_contact(Pcon pcon);void _search_contact(Pcon pcon);void _modify_contact(Pcon pcon);void _sort_contact(Pcon pcon);void _clear_contact(Pcon pcon);void _save_contact(Pcon pcon);void _load_contact(Pcon pcon);#endif //__CONTACT_H__
函数文件
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"////git//svn////void init_contact(Pcon pcon)//{//	memset(pcon->data, 0, MAX*sizeof(PeoInfo));//	pcon->size = 0;//}void init_contact(Pcon pcon){pcon->size =0;pcon->capacity=DEFAULT_SZ;pcon->data =(PeoInfo*)malloc(pcon->capacity *sizeof(PeoInfo));if(pcon->data ==NULL){memset(pcon->data ,0,pcon->capacity *sizeof(PeoInfo));exit(EXIT_FAILURE);}_load_contact(pcon);}void check_capacity(Pcon pcon){PeoInfo * tmp=0;if(pcon->size =pcon->capacity){realloc(pcon->data ,pcon->capacity+DEFAULT_INC);if(tmp==NULL){;}else{pcon->data =tmp;}pcon->capacity+=DEFAULT_INC;}}void _destory_contact(Pcon pcon){if(pcon->data!=NULL){free(pcon->data );pcon->data =NULL;}}void _add_contact(Pcon pcon){if(pcon->size >= MAX){printf("电话本满了\n");return;}printf("请输入名字:>");scanf("%s",pcon->data[pcon->size].name);printf("请输入年龄:>");scanf("%d",&(pcon->data[pcon->size].age));printf("请输入性别:>");scanf("%s",pcon->data[pcon->size].sex);printf("请输入电话:>");scanf("%s",pcon->data[pcon->size].tele);printf("请输入地址:>");scanf("%s",pcon->data[pcon->size].addr);pcon->size++;printf("添加成功\n");}void _display_contact(Pcon pcon){int i = 0;printf("%9s\t%3s\t%4s\t%11s\t%10s\n","name","age","sex","tele","addr");for(i = 0;i<pcon->size;i++){printf("%9s\t%3d\t%4s\t%11s\t%10s\n",pcon->data[i].name,pcon->data[i].age,pcon->data[i].sex,pcon->data[i].tele,pcon->data[i].addr);}}static int find_entry(Pcon pcon, char *name){int i = 0;for(i = 0;i<pcon->size; i++){if(strcmp(pcon->data[i].name,name) == 0){return i;}}return -1;}void _del_contact(Pcon pcon){int pos = 0;int index = 0;char name[NAME_MAX];if(pcon->size == 0){printf("电话本空\n");return;}printf("请输入要删除人的名字:>");scanf("%s",name);pos = find_entry(pcon, name);if(pos == -1){printf("找不到要删除的人\n");return;}//for(index = pos; index < pcon->size; index++){pcon->data[index] = pcon->data[index+1];}pcon->size--;printf("删除成功\n");}void _search_contact(Pcon pcon){char  name[NAME_MAX] = {0};int pos = 0;printf("请输入要查找人的名字:>");scanf("%s",name);pos = find_entry(pcon, name);if(pos == -1){printf("指定联系人不存在\n");return;}else{printf("%9s\t%3s\t%4s\t%11s\t%10s\n","name","age","sex","tele","addr");printf("%9s\t%3d\t%4s\t%11s\t%10s\n",pcon->data[pos].name,pcon->data[pos].age,pcon->data[pos].sex,pcon->data[pos].tele,pcon->data[pos].addr);}}void _modify_contact(Pcon pcon){char  name[NAME_MAX] = {0};int pos = 0;printf("请输入要修改人的名字:>");scanf("%s",name);pos = find_entry(pcon, name);if(pos == -1){printf("指定联系人不存在\n");return;}else{printf("请输入名字:>");scanf("%s",pcon->data[pos].name);printf("请输入年龄:>");scanf("%d",&(pcon->data[pos].age));printf("请输入性别:>");scanf("%s",pcon->data[pos].sex);printf("请输入电话:>");scanf("%s",pcon->data[pos].tele);printf("请输入地址:>");scanf("%s",pcon->data[pos].addr);}}//volatilevoid _sort_contact(Pcon pcon){int i = 0;int j = 0;for(i = 0;i<pcon->size-1; i++)//控制排序趟数{for(j = 0; j<pcon->size-1-i; j++){if(strcmp(pcon->data[j].name,pcon->data[j+1].name) > 0){PeoInfo tmp = {0};tmp = pcon->data[j];pcon->data[j] = pcon->data[j+1];pcon->data[j+1] = tmp;}}}}void _clear_contact(Pcon pcon){pcon->size = 0;}void _save_contact(Pcon pcon){int i=0;FILE*fwrite=fopen("contact.dat","w");if(pfwrite==NULL){perror("open file for write");exit(EXIT_FAULURE);}for(i=0;i<pcon->size;i++){fwrite(&pcon->data[i],sizeof(PeoInfo),1,pfwrite);fclose(pfwrite);}}void _load_contact(Pcon pcon){int i=0;FILE*fread=fopen("contact.dat","r");PeoInfo tmp=pcon->data[i];if(pfread==NULL){perror("open file for read");exit(EXIT_FAULURE);}while(&tmp,sizeof(PeoInfo),1,pread){check_capatity(pcon);pcon->data[i]=tmp;i++;pcon->size++;}}
测试代码
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void menu(){printf("***** 1.add     2.del    ****\n");printf("***** 3.modify  4.search ****\n");printf("***** 5.display 6.sort   ****\n");printf("***** 7.clear   0.exit   ****\n");}int main(){Contact con;char input = 1;init_contact(&con);while(input){menu();printf("请选择>:");scanf("%d",&input);switch(input){case ADD:_add_contact(&con);break;case DEL:_del_contact(&con);break;case SEARCH:_search_contact(&con);break;case MODIFY:_modify_contact(&con);break;case DISPLAY:_display_contact(&con);break;case SORT:_sort_contact(&con);break;case CLEAR:_clear_contact(&con);break;case EXIT:_destory_contact(&con);break;default:printf("选择错误\n");break;}}return 0;}
文件存储完成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: