标签:
void Save_contact(Pcon pcon) //将联系人信息保存到contact.dat中 { int i=0; FILE *pfwrite=fopen("contact.dat","w"); if(pfwrite == NULL) { perror("open file for write"); exit(EXIT_FAILURE); } for(i=0;i<pcon->size;i++) { fwrite(&(pcon->data[i]),sizeof(PerInfo),1,pfwrite); } fclose(pfwrite); }接下来就是如何加载信息了,代码实现如下:
void Load_contact(Pcon pcon) //加载信息 { int i=0; PerInfo tmp={0}; FILE *pfread=fopen("contact.dat","r"); if(pfread == NULL) { perror("open file for read"); exit(EXIT_FAILURE); } while(fread(&tmp,sizeof(PerInfo),1,pfread)) { judge_full(pcon); pcon->data[i]=tmp; i++; pcon->size++; } }在这里附上程序源代码便于读者理解:
#include"contact.h" void menu() { printf("***************简易通讯录***************\n"); printf("****1.添加联系人*******2.删除联系人****\n"); printf("****3.查找联系人*******4.修改联系人****\n"); printf("****5.显示联系人*******6.清空联系人****\n"); printf("****7.以名字排序联系人*0.退出**********\n"); printf("***************************************\n"); } int main() { Contact pcon; int intput=1; init(&pcon); while(intput) { menu(); printf("请输入一个你要选择的操作:"); scanf("%d",&intput); if(intput >= 0 && intput <= 7) { switch(intput) { case ADD:Add(&pcon); break; case DEL:Del(&pcon); break; case SEARCH:Search(&pcon); break; case REVISE:Revise(&pcon); break; case DISPLAY:Display(&pcon); break; case EMPTY:Empty(&pcon); break; case SORT:Sort_name(&pcon); break; case EXIT: Save_contact(&pcon); Free(&pcon); break; } } } system("pause"); return 0; }contach.h:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #define NAME_MAXNUM 20 #define SEX_MAXNUM 5 #define TELE_MAXNUM 12 #define ADDR_MAXNUM 10 #define MAX 1000 #define MAX_INIT 2 #define MAX_RISE 2 enum OP { EXIT, ADD, DEL, SEARCH, REVISE, DISPLAY, EMPTY, SORT }; typedef struct PerInfo { char name[NAME_MAXNUM]; int age; char sex[SEX_MAXNUM]; char tele[TELE_MAXNUM]; char addr[ADDR_MAXNUM]; }PerInfo; typedef struct Contact { PerInfo *data; //存储所有联系人的所有信息 int size; //记录联系人的个数 int capacity; //通讯录的容量 }Contact,*Pcon; void init(Pcon pcon); //初始化 void Add(Pcon pcon); //添加联系人 void Del(Pcon pcon); //删除指定联系人 void Search(Pcon pcon); //查找指定联系人 void Revise(Pcon pcon); //修改指定联系人 void Display(Pcon pcon); //打印联系人信息 void Empty(Pcon pcon); //清空联系人信息 void Sort_name(Pcon pcon); //以名字排序所有联系人 void Free(Pcon pcon); //释放空间 void Save_contact(Pcon pcon);//在文件中存储联系人信息 void Load_contact(Pcon pcon);//加载联系人信息contact.c:
#include"contact.h" void init(Pcon pcon) { pcon->data=(PerInfo *)malloc(MAX_INIT*sizeof(PerInfo)); if(pcon->data == NULL) { printf("out of memory\n"); exit(EXIT_FAILURE); } memset(pcon->data,0,MAX_INIT*sizeof(PerInfo)); pcon->size=0; pcon->capacity=MAX_INIT; Load_contact(pcon); } void judge_full(Pcon pcon) //当实际联系人个数和初始化的容量相等时用realloc增容 { if(pcon->size == pcon->capacity) { PerInfo *tmp=(PerInfo *)realloc(pcon->data,(pcon->capacity+MAX_RISE)*sizeof(PerInfo)); if(tmp == NULL) { printf("out of memory\n"); exit(EXIT_FAILURE); } else { pcon->data=tmp; pcon->capacity+=MAX_RISE; } } } void Add(Pcon pcon) //添加联系人 { judge_full(pcon); printf("请输入你添加之后的联系人信息:(姓名 年龄 性别 联系电话 住址):\n"); scanf("%s",pcon->data[pcon->size].name); scanf("%d",&(pcon->data[pcon->size].age)); scanf("%s",pcon->data[pcon->size].sex); scanf("%s",pcon->data[pcon->size].tele); scanf("%s",pcon->data[pcon->size].addr); pcon->size++; printf("添加成功\n"); } int Find_position(Pcon pcon,char *str) //查找联系人函数 { int i=0; for(i=0;i<pcon->size;i++) { if(strcmp(pcon->data[i].name,str) == 0) //将要查找的姓名与通讯录里的联系人匹配,找到就返回下标 { return i; } } return -1; } void Del(Pcon pcon) //删除指定联系人 { int ret=0; int i=0; char str[NAME_MAXNUM]={0}; printf("请输入你要删除的联系人姓名:"); scanf("%s",str); ret=Find_position(pcon,str); if(ret != -1) { for(i=ret;i<pcon->size;i++) { pcon->data[i]=pcon->data[i+1]; //删除的元素之后的元素往前挪一个位置 } pcon->size--; } else { printf("通讯录里没有此联系人\n"); return ; } } void Search(Pcon pcon) //查找指定联系人 { int ret=0; char str[NAME_MAXNUM]={0}; printf("请输入你要查找的联系人的名字:"); scanf("%s",str); ret=Find_position(pcon,str); if(ret != -1) { printf("查找成功\n"); } else { printf("通讯录里无此人\n"); return ; } } void Revise(Pcon pcon) //修改指定联系人 { int ret=0; char str[NAME_MAXNUM]={0}; printf("请输入你要修改的联系人的姓名:"); scanf("%s",str); ret=Find_position(pcon,str); if(ret != -1) { int input=0; printf("请输入你要修改的信息:1.姓名2.年龄3.性别4.联系电话5.住址\n"); scanf("%d",&input); switch(input) { case 1:printf("请输入修改后的名字:\n"); scanf("%s",pcon->data[ret].name);break; case 2:printf("请输入修改后的年龄:\n"); scanf("%d",&(pcon->data[ret].age));break; case 3:printf("请输入修改后的性别:\n"); scanf("%s",pcon->data[ret].sex);break; case 4:printf("请输入修改后的联系电话:\n"); scanf("%s",pcon->data[ret].tele);break; case 5:printf("请输入修改后的住址:\n"); scanf("%s",pcon->data[ret].addr);break; default:printf("error"); break; } } else { printf("通讯录里无此人\n"); return ; } } void Display(Pcon pcon) //显示联系人信息 { int i=0; for(i=0;i<pcon->size;i++) { printf("%s %d %s %s %s\n",pcon->data[i].name,pcon->data[i].age,pcon->data[i].sex, pcon->data[i].tele,pcon->data[i].addr); } } void Empty(Pcon pcon) //清空联系人 { pcon->size=0; } void Sort_name(Pcon pcon) //以名字排序联系人 { int flag=0; int i=0; int j=0; for(i=0;i<pcon->size-1;i++) { flag=0; //对冒泡排序的优化 for(j=0;j<pcon->size-1-i;j++) { if(strcmp(pcon->data[j].name,pcon->data[j+1].name) > 0) //默认升序排列 { PerInfo tmp=pcon->data[j]; pcon->data[j]=pcon->data[j+1]; pcon->data[j+1]=tmp; flag=1; } } if(flag == 0) break; } } void Free(Pcon pcon) { free(pcon->data); pcon->data=NULL; exit(0); } void Save_contact(Pcon pcon) //将联系人信息保存到contact.dat中 { int i=0; FILE *pfwrite=fopen("contact.dat","w"); if(pfwrite == NULL) { perror("open file for write"); exit(EXIT_FAILURE); } for(i=0;i<pcon->size;i++) { fwrite(&(pcon->data[i]),sizeof(PerInfo),1,pfwrite); } fclose(pfwrite); } void Load_contact(Pcon pcon) //加载信息 { int i=0; PerInfo tmp={0}; FILE *pfread=fopen("contact.dat","r"); if(pfread == NULL) { perror("open file for read"); exit(EXIT_FAILURE); } while(fread(&tmp,sizeof(PerInfo),1,pfread)) { judge_full(pcon); pcon->data[i]=tmp; i++; pcon->size++; } }那仫代码是不是能够实现保存信息的功能呢?请看下图:
标签:
原文地址:http://blog.csdn.net/qq_34328833/article/details/51441079