通讯录(三)----文件实现

16 篇文章 4 订阅
9 篇文章 0 订阅


通讯录(二)-----动态实现      http://blog.csdn.net/snow_5288/article/details/51420133


在以上两种方式中,每次运行程序我们都得重新输入,之前输入的成员信息并不会保存,而现实中,通讯录里的信息创建后是永久保存的,除非你删除它,今天我们就来模拟一下如何将数据存储在文件中,当下一次运行时加载一下即可,这种做法更贴合实际。

如何创建相应的文件呢?

如图中,单击打开文件,即左上方第三个黄色标志,创建相应的文件contact.dat就好了。


程序中会用到与文件操作相关的函数,提前介绍一下。

 fopen 它的函数原型为:FILE*fopen(const char *filename,const char *mode) ,filename:创建文件的名字;mode:允许进入文件的类型;简单来说这个文件的作用就是打开一个文件流;与fopen:关闭文件流配套使用
        perror: 它的函数原型为:void perror(const char * string) ,这是一种报告文件错误的函数;后面包括一个分号和一个空格,然后打印出一条用于解释errno当前错误代码的信息;
        fwrite: 它的函数原型为:size_t fwrite(const void *buffer,size_t size,size_t count,FILE*stream) ,buffer:数据写入的体格缓冲区;
下面看一下具体的代码实现:
contact.h
#define _CRT_SECURE_NO_WARNINGS 1

#ifndef __CONTACT_H//防止重复引入
#define __CONTACT_H__

#include <stdio.h>
#include <string.h>
#include<stdlib.h>



enum OP//使用枚举,让switch语句更清晰明了
{
	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 PRESENT_CAPACITY 2//通讯录最开始可容纳的成员个数
#define CHANGE_CAPACITY 2//通讯录容量的改变,可增可减


typedef struct Person//通讯录成员的具体信息
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}Person;


typedef struct Contact
{
	Person *data;//通讯录能保存的最多人数
	int size;//当前包含的人数
	int capacity;//通讯录的容量
}Contact,*con;//指针用来在函数内部接收结构体指针


void menu();//打印菜单
void _init(con pcon);//初始化函数
void _check_capacity(con pcon);//检查通讯录的容量
void _add_contact(con pcon);//增加成员
void _del_contact(con pcon);//删除成员
void _search_contact(con pcon);//查询成员
void _modify_contact(con pcon);//修改成员
void _display_contact(con pcon);//显示所有成员
void _clear_contact(con pcon);//清空所有成员
void _sort_contact(con pcon);//按姓名排序所有成员
void _save_contact(con pcon);//将成员信息保存在文件中
void _load_contact(con pcon);//将成员信息从文件中读取出来
	


#endif //__CONTACT_H__

test.c
#include"contact.h"

int main()
{
	Contact pcon={0};
int input=1;
_init(&pcon);
while(input)
{
	menu();
	printf("请选择:");
	scanf("%d",&input);
if(input>=0&&input<=7)
{
	switch(input)
	{
	case ADD:
		_add_contact(&pcon);
		break;
	case DEL:
		_del_contact(&pcon);
		break;
	case SEARCH:
		_search_contact(&pcon);
		break;
	case MODIFY:
		_modify_contact(&pcon);
		break;
	case DISPLAY:
		_display_contact(&pcon);
		break;
	case CLEAR:
		_clear_contact(&pcon);
		break;
	case SORT:
		_sort_contact(&pcon);
		break;
	case EXIT:
		_save_contact(&pcon);
		free(pcon.data);
		pcon.data=NULL;
		exit(1);
		break;
	default:
		printf("选择参数错误\n");
		break;
	}
}
}
	
system("pause");
return 0;
}


contact.c
#include"contact.h"

void menu()//打印菜单
{
	printf("***********************\n");
    printf("1.    添加联系人信息\n");
    printf("2.    删除指定联系人信息\n");
    printf("3.    修改指定联系人信息\n");
    printf("4.    查找指定联系人信息\n");
    printf("5.    显示所有联系人信息\n");
    printf("6.    以名字排序所有联系人\n");
	printf("7.    清空所有联系人\n");
	printf("0.    退出\n");
	printf("************************\n");
}
void _init(con pcon)
{
	pcon->data=(Person *)malloc(PRESENT_CAPACITY*sizeof(Person));
		if(pcon->data==NULL)
	{
	    printf("out of memory.\n");
		exit(EXIT_FAILURE);
	}
	memset((void *)pcon->data,0,PRESENT_CAPACITY*sizeof(Person));
    pcon->size=0;
	pcon->capacity=PRESENT_CAPACITY;
	_load_contact(pcon);

}
 int find(con pcon,char arr[])//由于后面的很多函数都用到查找函数,所以将其封装为函数
{
   int i=0;
   for(i=0; i<pcon->size; i++)
   {
       if(strcmp(pcon->data[i].name,arr)==0)
		  {
			  return i;
	   }
   }
   return -1;
}
void _check_capacity(con pcon)//增容
{
  if(pcon->size==pcon->capacity)//说明当前人数已达到通讯录容量的最大值{
  {		
     Person *tmp=(Person*)realloc(pcon->data,(pcon->capacity+CHANGE_CAPACITY)*sizeof(Person));
		   if(tmp==NULL)
		   {
		       printf("out of memory\n");
			   exit(EXIT_FAILURE);
		   }
		   else
		   {
			   pcon->data=tmp;
		       (pcon->capacity)+=CHANGE_CAPACITY;
		   }
}

}

void _add_contact(con pcon)//增加成员
{
    _check_capacity(pcon);
	    
	    printf("请输入你要添加的成员信息:\n");  
        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 ));
		printf("添加成功!\n");
		pcon->size++;
}

void _display_contact(con pcon)//显示所有成员
{
	int i=0;
	for(i=0; i<pcon->size; i++)
	{
		printf("%s%10d%10s%10s%10s\n",pcon->data[i].name,
			                          pcon->data[i].age,
									  pcon->data[i].sex,
									  pcon->data[i].tele,
									  pcon->data[i].addr);
	}
	printf("打印成功!\n");
}

void _del_contact(con pcon)//删除成员
{
   int i=0;
   char name[20]={0};
   printf("请输入你要删除的成员姓名:");
   scanf("%s",&name);
   i=find(pcon,name);
   if(i>=0)
   {
       pcon->data[i]=pcon->data[pcon->size-1];
	   (pcon->size)--;
	   printf("删除成功!\n");
   }
   else
	   printf("没找到要删除的成员!\n");
}

void _search_contact(con pcon)//查询成员
{
 int i=0;
 char name[20]={0};
 printf("请输入你要查询成员的姓名:");
 scanf("%s",&name);
 i=find(pcon,name);
 if(i==-1)
 {
     printf("查找的联系人不存在!\n");
	 return;
 }
 else
 {
	printf("%s%10s%10s%10s%10s\n","name","age","sex","tele","addr");
    printf("%s%10d%10s%10s%10s\n",pcon->data[i].name,
			                      pcon->data[i].age,
								  pcon->data[i].sex,
								  pcon->data[i].tele,
								  pcon->data[i].addr); 
	printf("查询成功!\n");
 }

}

void _modify_contact(con pcon)//修改成员
{
	int i=0;
	char name[20]={0};
	printf("请输入你要修改的成员:");
	scanf("%s",name);
	i=find(pcon,name);
	if(i>=0)
	{
	    printf("请输入你要修改的成员信息:\n");  
        printf("请输入姓名:");  
		scanf("%s",(pcon->data[i].name ));  
        printf("请输入年龄:");
		scanf("%d",&(pcon->data[i].age ));  
        printf("请输入性别:");
		scanf("%s",(pcon->data[i].sex));  
        printf("请输入电话:");
		scanf("%s",(pcon->data[i].tele ));  
        printf("请输入地址:");
        scanf("%s",(pcon->data[i].addr ));
		printf("修改成功!");
	}
	else
		printf("没找到你要修改的成员!\n");
}

void _sort_contact(con pcon)//按姓名排序所有成员
{
	int i=0;
	int j=0;
	int flag=0;
	for(i=0; i<pcon->size-1; i++)//控制排序趟数,最后一次不需要交换
	{
		flag=1;
	   for(j=0; j<pcon->size-1-i; j++)
	   {
	        if(strcmp((pcon->data[j].name),(pcon->data[j+1].name))>0)
			{
			   Person tmp= pcon->data[j];
			   pcon->data[j]=pcon->data[j+1];
			   pcon->data[j+1]=tmp;
			  flag=1;
			}
			if(flag==0)
		   break;
       }
	   
	}
	printf("排序成功!\n");
	//_display_contact(pcon);
}

void _clear_contact(con pcon)//清空所有成员
{
	pcon->size=0;//因为刚开始时通讯录为空,所以这条语句可达到清空目的
}
<span style="background-color: rgb(255, 255, 153);"><span style="color:#33FF33;">void _save_contact(con 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(Person),1,pfWrite);
	}
	fclose(pfWrite);
}</span></span>
<span style="color:#FF6666;"><span style="background-color: rgb(255, 255, 153);">void _load_contact(con pcon)//从文件中加载成员信息
{
	int i=0;
	Person tmp={0};//创建临时变量保存每次读取的信息
	FILE *pfRead=fopen("contact.dat","r");
	if(pfRead==NULL)
	{
	    perror("open file for write");
		exit(EXIT_FAILURE);
	}
	//从文件中读取数据
	while(fread(&tmp,sizeof(Person),1,pfRead))
	{
	    _check_capacity(pcon);//判断容量是否溢出
		pcon->data[i]=tmp;
		i++;
		pcon->size++;
	}

}</span></span>

结果如何呢?让我们一起来看看。

由此可见,当我们运行程序时,上次保存的数据依旧存在,怎么样,不错吧,你也赶快动手试试吧!


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值