C语言通讯录管理系统 利用fwrite和fread进行文件存取

本通讯录管理系统采用 C语言编写,运行直接可以使用。由头文件 1.h 与源文件test.c构成。

fread 是一个函数,它从文件流中读数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回 0。

  1.  本通讯录fread(&(MM),sizeof(struct People),1,fp);

MM:是首先创建的结构体用于存储文件里的数据。

sizeof(struct People):计算原结构体的大小

1:每次取一个

fp:指针所指的文件


fwrite() 是 C 语言标准库中的一个文件处理函数,功能是向指定的文件中写入若干数据块,如成功执行则返回实际写入的数据块数目。该函数以二进制形式对文件进行操作,不局限于文本文件。

  1.  本通讯录fwrite(&(book->people[i]),sizeof(struct People),1,fp);


book->people[i]:储存到文件的数据

sizeof(struct People):计算原结构体的大小

1:每次取一个

fp:指针所指的文件


头文件 1.h

#ifndef __1_H__
#define  __1_H__


#include 
#include 
#include 

typedef struct People
{
	char name[10];
	char sex[10];
	int age;
	char adress[10];
	char telphone[10];

}People;

typedef struct Book
{
	struct People *people;
	int size;//实际大小
	int capacity;//容量
}Book;

void CheckFull(Book *book);//判断容量是否满
void DeletePeople(Book *book);//删除一个人
void FindPeople(Book *book);//寻找一个人
void Init(Book *book);//初始化
void PeoplePrintf(Book *book);//打印
void InsertPeople(Book *book);//添加人员
void Change(Book *book);//改变一个人的信息
void load1(Book *book);//读取文件
void save1(Book *book);//fwrite函数是以二进制方式进行储存
void menu();//菜单

#endif
源文件 test.c


#include "1.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("******* 8.   退  出  *******\n");
	printf("****************************\n");


}
void InsertPeople(Book *book)//插入联系人
{
	int n;
	if (book->size==book->capacity)
	{
		CheckFull(book);
	}
	
	printf("你要输入几个人: ");
	scanf("%d",&n);
	do 
	{
		printf("\n输入姓名:");
		scanf("%s",book->people[book->size].name);
		printf("输入电话:");
		scanf("%s",book->people[book->size].telphone);
		printf("输入性别:");
		scanf("%s",book->people[book->size].sex);
		printf("输入年龄:");
		scanf("%d",&(book->people[book->size].age));
		printf("输入住址:");
		scanf("%s",book->people[book->size].adress);
		++(book->size);
		if (book->size==book->capacity)
		{
			CheckFull(book);
		}
	} while (--n);
	printf("\n添加成功!!!");

}
void PeoplePrintf(Book *book)//打印联系人
{
	int i;
	printf("--------------------------------------------------\n");
	printf("|               通讯录管理系统                   |\n");
	printf("--------------------------------------------------\n");
	for(i=0;isize;i++)
	{


		printf("   姓名:%s\t\n",book->people[i].name);
		printf("   性别:%s\t\n",book->people[i].sex);
		printf("   年龄:%d\t\n",book->people[i].age);
		printf("   地址:%s\t\n",book->people[i].adress);
		printf("   电话:%s\t\n",book->people[i].telphone);

		printf("--------------------------------------------------\n");

	}
}
void Init(Book *book)//初始化
{
	book->size=0;
	book->capacity=1;
	book->people=(struct People *)malloc(book->capacity*sizeof(struct People));


}
void CheckFull(Book *book)//判断容量是否满,进行扩容
{
	struct People *tem=(struct People *)realloc(book->people,sizeof(struct People)*book->capacity*2);
	book->capacity*=2;
	book->people=tem;
}
int Find_M(Book *book,char *name)//判断是否有这个人
{
	int i;
	for (i=0;isize;i++)
	{
		if (strcmp(name,book->people[i].name)==0)
		{
			return i;
		}

	}
	return -1;
}
void FindPeople(Book *book)//寻找一个人
{
	char n[10];
	int x;
	printf("你所查找的人:");
	scanf("%s",n);
	x=Find_M(book,n);
	if (x!=-1)
	{
		printf("--------------------------------------------------\n");
		printf("|               通讯录管理系统                   |\n");
		printf("--------------------------------------------------\n");
		printf("   姓名:%s\t\n",book->people[x].name);
		printf("   性别:%s\t\n",book->people[x].sex);
		printf("   年龄:%d\t\n",book->people[x].age);
		printf("   地址:%s\t\n",book->people[x].adress);
		printf("   电话:%s\t\n",book->people[x].telphone);

		printf("--------------------------------------------------\n");
	} 
	else
	{
		printf("查无此人!\n");
	}
}	
void DeletePeople(Book *book)//删除一个人
{
	char n[10];
	int m=0;
	int x,i;
	printf("你要删除谁: ");
	scanf("%s",n);
	x=Find_M(book,n);
	if (x!=-1)
	{
		for (i=x;isize;i++)
		{
			book->people[i]=book->people[i+1];
		}
		--(book->size);
		printf("\n删除成功!!!");

	} 
	else
	{
		printf("没有找到此人,删除失败!!!\n");
	}

}
void Change(Book *book)//改变一个人的信息
{
	char name[10];

	int x;
	printf("请输入你所要修改的姓名:");
	scanf("%s",name);
	x=Find_M(book,name);
	if (x!=-1)
	{
		printf("电话号码修改为:");
		scanf("%s",book->people[x].telphone);
		printf("\n修改成功!!!");

	} 
	else
	{
		printf("没有找到修改的人!!\n");
	}


}
void save1(Book *book)//fwrite函数是以二进制方式进行储存
{
	int i;
	FILE *fp;
	fp=fopen("zx.txt","wt ");
	for(i = 0 ; i < book->size; i++) 
	fwrite(&(book->people[i]),sizeof(struct People),1,fp);
	fclose(fp);
}
void load1(Book *book)//读取文件里的信息写入结构体
{
	int i=0;
	FILE *fp=fopen("zx.txt","rt");
	struct People MM={0};
	fread(&(MM),sizeof(struct People),1,fp);
	while(!feof(fp))
	{
		if (book->size==book->capacity)
		{
			CheckFull(book);
		}
		book->people[i]=MM;
		book->size++;
		i++;
		fread(&(MM),sizeof(struct People),1,fp);
	}
	fclose(fp);
	
}

int main()
{

	int a;
	Book book;
	Init(&book);



	do 
	{
		menu();
		printf("请选择:");
		scanf("%d",&a);
		switch (a)
		{
		case 1:

			InsertPeople(&book);
			Sleep(2000);
			system("cls");

			break;
		case 2:
			Change(&book);
			Sleep(2000);
			system("cls");


			break;
		case 3:
			DeletePeople(&book);
			Sleep(2000);
			system("cls");

			break;
		case 4:
			FindPeople(&book);
			system("pause");
			system("cls");


			break;
		case 5:PeoplePrintf(&book);
			system("pause");
			system("cls");

			break;
		case 6:load1(&book);
			printf("导入成功!!!");
			system("pause");
			system("cls");
			break;
		case 7:save1(&book);
			printf("导出成功!!!");
			system("pause");
			system("cls");
			break;
		case 8:
			return;
			break;
		default:printf("请输入真确的序号!!!\n");

		}
	} while (1);





	system("pause");
	return 0;
}




你可能感兴趣的:(c语言)