Lenguaje C - libreta de direcciones (puede guardar información de la libreta de direcciones)

prefacio

Después de escribir el programa de la libreta de direcciones, cuando la libreta de direcciones se está ejecutando, puede agregar o eliminar datos en la libreta de direcciones. En este momento, los datos se almacenan en la memoria. Cuando el programa sale, los datos en la libreta de direcciones se guardarán naturalmente. desaparecer.Existe, y cuando el programa de libreta de direcciones se ejecute la próxima vez, los datos deben volver a ingresarse.Es muy incómodo usar una libreta de direcciones de este tipo.

Dado que es una libreta de direcciones, la información debe registrarse. Solo cuando elija eliminar los datos, los datos ya no existirán. Esto implica el problema de la persistencia de los datos.Generalmente, los métodos de persistencia de datos incluyen almacenar datos en archivos de disco y almacenarlos en bases de datos.

El uso de archivos puede almacenar datos directamente en el disco duro de la computadora, logrando la persistencia de los datos.

Guardar la información en la libreta de direcciones

La información de la libreta de direcciones debe guardarse cuando se sale de la libreta de direcciones. Tenga en cuenta que la información de la libreta de direcciones debe guardarse en un archivo antes de destruir la libreta de direcciones. La conservación de la información de la libreta de direcciones consiste en guardar la información escribiendo la información de la libreta de direcciones en el archivo a través de la operación de archivo.

void SaveContact(Contact* pc)
{
    
    
	FILE* pf = fopen("contact.dat", "w");
	if (pf == NULL)
	{
    
    
		perror("SaveContact");
		return;
	}
	//写文件
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
    
    
		fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
}

Cargando información de contacto

Antes de agregar, eliminar, verificar y modificar la libreta de direcciones, la libreta de direcciones debe cargar la información almacenada anteriormente, por lo que solo cuando se inicializa la libreta de direcciones, la información se lee desde el archivo a la libreta de direcciones para completar el proceso de carga de información. Carga de información Al leer el archivo para detener (no sé cuánta información tiene el archivo), entonces necesita usar la función fread, juzgue por el valor de retorno de la función fread, si es menor que el número real de cuenta para ser leído, significa que esta lectura es imposible leer los datos después de leer fread. Lea los datos del archivo y colóquelos en la libreta de direcciones. Al colocar datos en la libreta de direcciones, debe prestar atención a que la libreta de direcciones puede almacenar hasta DEFAULT_SZ datos cuando la libreta de direcciones se acaba de inicializar. La cantidad de datos cargados puede ser mayor que la capacidad de la libreta de direcciones recién inicializada. En este momento, es necesario determinar si aumentar la capacidad. Después de evaluar el aumento de capacidad, agregue la información de la persona leída del archivo a la libreta de direcciones recién inicializada y luego aumente el número de información válida en la libreta de direcciones actual en uno.

void CheckCapacity(Contact* pc)
{
    
    
	if (pc->sz == pc->capacity)
	{
    
    
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
		if (ptr != NULL)
		{
    
    
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功\n");
		}
		else
		{
    
    
			perror("AddContact");
			printf("增加联系人失败\n");
			return;
		}
	}
}

void LoadContact(Contact* pc)
{
    
    
	FILE* pf = fopen("contact.dat", "r");
	if (pf == NULL)
	{
    
    
		perror("LoadContact");
		return;
	}
	//读文件
	PeoInfo tmp = {
    
     0 };
	while (fread(&tmp, sizeof(PeoInfo), 1, pf))
	{
    
    
		//是否需要增容
		CheckCapacity(pc);
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
}


//初始化
void InitContact(Contact* pc)
{
    
    
	pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));
	if (pc->data == NULL)
	{
    
    
		perror("InitContact");
		return;
	}
	pc->sz = 0;//初始化后默认是0
	pc->capacity = DEFAULT_SZ;

	//加载文件
	LoadContact(pc);
}

El código general de la libreta de direcciones (que puede guardar información de la libreta de direcciones)

contacto.h

#pragma once


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

#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30


#define MAX 1000

#define DEFAULT_SZ 3
#define INC_SZ 2


//类型的定义
typedef struct PeoInfo
{
    
    
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;



//通讯录
typedef struct Contact
{
    
    
	PeoInfo* data;//指向动态申请的空间,用来存放联系人的信息
	int sz;//记录的是当前通讯录中有效信息的个数
	int capacity;//记录当前通讯录的最大容量
}Contact;


//初始化通讯录
void InitContact(Contact* pc);

//增加联系人
void AddContact(Contact* pc);

//打印联系人信息
void PrintContact(const Contact* pc);

//删除联系人的信息
void DelContact(Contact* pc);

//查找指定联系人
void SearchContact(Contact* pc);

//修改指定联系人
void ModifyContact(Contact* pc);

//销毁通讯录
void DestoryContact(Contact* pc);

//排序通讯录
void SortContact(struct Contact* pc);

//保存通讯录信息到文件
void SaveContact(Contact* pc);

//加载文件内容到通讯录
void LoadContact(Contact* pc);

//检测增容的问题
void CheckCapacity(Contact* pc);



contacto.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"


//初始化
void InitContact(Contact* pc)
{
    
    
	pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));
	if (pc->data == NULL)
	{
    
    
		perror("InitContact");
		return;
	}
	pc->sz = 0;//初始化后默认是0
	pc->capacity = DEFAULT_SZ;

	//加载文件
	LoadContact(pc);
}

void DestoryContact(Contact* pc)
{
    
    
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
}


void SaveContact(Contact* pc)
{
    
    
	FILE* pf = fopen("contact.dat", "w");
	if (pf == NULL)
	{
    
    
		perror("SaveContact");
		return;
	}
	//写文件
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
    
    
		fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
}

void LoadContact(Contact* pc)
{
    
    
	FILE* pf = fopen("contact.dat", "r");
	if (pf == NULL)
	{
    
    
		perror("LoadContact");
		return;
	}
	//读文件
	PeoInfo tmp = {
    
     0 };
	while (fread(&tmp, sizeof(PeoInfo), 1, pf))
	{
    
    
		//是否需要增容
		CheckCapacity(pc);
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
}


void CheckCapacity(Contact* pc)
{
    
    
	if (pc->sz == pc->capacity)
	{
    
    
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
		if (ptr != NULL)
		{
    
    
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功\n");
		}
		else
		{
    
    
			perror("AddContact");
			printf("增加联系人失败\n");
			return;
		}
	}
}

//增加联系人
void AddContact(Contact* pc)
{
    
    
	//考虑增容
	CheckCapacity(pc);
	//增加一个人的信息
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
	printf("增加成功\n");
}



void PrintContact(const Contact* pc)
{
    
    
	int i = 0;
	//打印标题
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
    
    
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

static int FindByName(Contact* pc, char name[])
{
    
    
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
    
    
		if (strcmp(pc->data[i].name, name) == 0)
		{
    
    
			return i;
		}
	}

	return -1;//找不到
}

void DelContact(Contact* pc)
{
    
    
	char name[MAX_NAME] = {
    
     0 };

	if (pc->sz == 0)
	{
    
    
		printf("通讯录为空,无需删除\n");
		return;
	}
	printf("请输入要删除人的名字:>");
	scanf("%s", name);

	//1. 查找要删除的人
	//有/没有
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
    
    
		printf("要删除的人不存在\n");
		return;
	}
	//2. 删除
	int i = 0;
	for (i = pos; i < pc->sz - 1; i++)
	{
    
    
		pc->data[i] = pc->data[i + 1];
	}

	pc->sz--;
	printf("删除成功\n");
}


void SearchContact(Contact* pc)
{
    
    
	char name[MAX_NAME] = {
    
     0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);

	int pos = FindByName(pc, name);
	if (pos == -1)
	{
    
    
		printf("要查找的人不存在\n");
		return;
	}
	else
	{
    
    
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		//打印数据
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}


void ModifyContact(Contact* pc)
{
    
    
	char name[MAX_NAME] = {
    
     0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);

	int pos = FindByName(pc, name);
	if (pos == -1)
	{
    
    
		printf("要修改的人不存在\n");
		return;
	}
	else
	{
    
    
		printf("请输入名字:>");
		scanf("%s", pc->data[pos].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[pos].addr);

		printf("修改成功\n");
	}
}



//自定义比较函数
static int CmpByName(const void* e1, const void* e2)
{
    
    
	return strcmp((const char*)e1, (const char*)e2);
}


void SortContact(struct Contact* pc)
{
    
    
	qsort(pc->data, pc->sz, sizeof(PeoInfo), CmpByName);//排序
	printf("排序成功\n");
}

prueba.c

#define _CRT_SECURE_NO_WARNINGS 1



//当通讯录退出的时候,把信息写到文件
//当通讯录初始化的时候,加载文件的信息到通讯录中



#include "contact.h"

void menu()
{
    
    
	printf("********************************\n");
	printf("******  1. add    2. del  ******\n");
	printf("******  3. search 4. modify*****\n");
	printf("******  5. sort   6. print *****\n");
	printf("******  0. exit            *****\n");
	printf("********************************\n");
}

enum Option
{
    
    
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT
};

int main()
{
    
    
	int input = 0;
	//创建通讯录
	Contact con;//通讯录
	//初始化通讯录
	//给data申请一块连续的空间再堆区上
	//sz=0
	//capacity 初始化为当前的最大的容量
	InitContact(&con);

	do
	{
    
    
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
    
    
		case ADD:
			//增加人的信息
			AddContact(&con);
			break;
		case DEL:
			//删除
			DelContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case PRINT:
			PrintContact(&con);
			break;
		case EXIT:
			//保存信息到文件
			SaveContact(&con);
			//销毁通讯录
			DestoryContact(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

	return 0;
}


Supongo que te gusta

Origin blog.csdn.net/AI_ELF/article/details/130989285
Recomendado
Clasificación