码迷,mamicode.com
首页 > 其他好文 > 详细

模拟实现通讯录-文件的方法

时间:2016-05-18 10:52:49      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

模拟实现通讯录之文件的方法

 通讯录的两种实现方法:

静态的方法:
动态的方法:
     
      在这两种方法中信息都是不能被保存的,即我们每次测试程序时添加联系人信息都是需要重新输入,是不是觉得很麻烦呢?如果我们能够把联系人信息保存起来那仫我们是不是每次测试程序就不需要再次输入联系人信息了呢?这就是我们今天要实现的通讯录-文件的版本。
      其实只需要对原来动态的版本稍加修改就可以了,既然要把联系人信息保存起来我们就需要在清空联系人之前就把它保存起来,我们首先需要创建一个文本文档用于保存联系人信息,在这里我们提供两种创建文件的方法:
      方法一:
      在VS2008中打开文件直接创建,我创建的文件名字是contact.dat,操作步骤如下:
      技术分享
     
       技术分享
       方法二:
         找到你的代码保存的目录,打开,创建contact.dat,记住千万不要在debug下保存,创建过程如下:
         技术分享
       
        技术分享
        创建好文件之后就是如何实现保存联系人信息的函数了,这里我们需要用到这样几个文件操作的函数:
        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:数据写入的体格缓冲区;size:你要写入数据的字节数;count:被写入数据的最大个数;stream:目标文件指针;
        代码实现如下:
        
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++;
	}
}
          在这里附上程序源代码便于读者理解:
          test.c:
          
#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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!