通讯录------文件存取

设计内容
1、通讯录是一个简易的管理软件,管理所有联系人的通讯纪录(电话,e-mail)。
2、使用文件存取
1)、使用文件存储通讯录
2)、可以不保存新输入的纪录,但需要确认是否保存输入纪录
3)、如果已经有文件,只能在其后追加
3、联系人的分组管理
可以把联系人分为以下几组:亲戚,同学,朋友,工作,普通,其他等类型,存储联系人通讯纪录时需选择适当的分组。
4、通讯录的显示
1)、系统开启后默认显示所有联系人的通讯录
2)、可以按组显示该组内所有联系人的通讯纪录
3)、可以查询某人的通讯录,如无此人则提示“没有此人”

#include <iostream>
#include<stdio.h>
#include<fstream>
#include<sstream>
#include<iomanip>
using namespace std;
//#define MAX 100;
struct node {
	char Name[10];
	char Telephone[20];
	char Email[20];
	char Type[20];
};
class People {
private:
	struct node info[100];
	int m_number;
public:
	void initial();//初始化数组
	int interface();//界面
	void add();//添加
	void search();//查找
	void sort_search();//分组查找
	void dele();//删除
	void change();//修改
	void display();//显示输出
	void save_info();//信息保存
	static int count;//总人数
};
int People::count = 0;
void People::initial()
{
	string line;
	ifstream file;//输入流
	int i = 0;
	file.open("D:\\zly.txt");
	if (!file)
	{
		cout << "文件打开失败" << endl;
	}
	while (getline(file, line))//按行读取数据
	{
		istringstream ss;//字符串流
		ss.str(line);//把按行读取的数据传到字符串流中
		//分隔文件中每一行的数据
	    ss >> info[i].Name;
		ss >> info[i].Telephone;
		ss >> info[i].Email;
		ss >> info[i].Type;
		//
		i++;
	}
	count = i;
}
void People::save_info()
{
	ofstream fs; //输出流
	fs.open("D:\\zly.txt");
	if (!fs)//if(!is_open())
	{
		cout << "文件打开失败" << endl;
		system("pause");
		return;
	}
	for (int i = 0; i<count; i++)//向文件中存入数据
	{
		fs  << info[i].Name << setw(20)
			<< info[i].Telephone << setw(20)
			<< info[i].Email << setw(20)
			<< info[i].Type << endl;
	}
	fs.close();
}

int People::interface()
{
	int number = 0;;
	cout << "              *+=================================================+*" << endl;
	cout << "              *|                                                 |*" << endl;
	cout << "              *|                多功能电子通讯录                 |*" << endl;
	cout << "              *|                                                 |*" << endl;
	cout << "              *|                                                 |*" << endl;
	cout << "              *|                                                 |*" << endl;
	cout << "              *|-------------------------------------------------|*" << endl;
	cout << "              *|      1.添加联系人信息       2.查询联系人信息    |*" << endl;
	cout << "              *|-------------------------------------------------|*" << endl;
	cout << "              *|      3.删除联系人信息       4.修改联系人信息    |*" << endl;
	cout << "              *|-------------------------------------------------|*" << endl;
	cout << "              *|      5.显示所有联系人信息   6.显示分组联系人信息|*" << endl;
	cout << "              *|-------------------------------------------------|*" << endl;
	cout << "              *|                    7.退出                       |*" << endl;
	cout << "              *|-------------------------------------------------|*" << endl;
	cout << "              *+=================================================+*" << endl;
	cout << "                                                     " << endl;
	cout << "请选择你要实现的功能:" << endl;
	cin >> number;
	if (number == 1 || number == 2 || number == 3 || number == 4 || number == 5 || number == 6 || number == 7)
	{
		m_number = number;
		return m_number;
	}
}

void People::add()
{
	char ch = 0;
	int  flag = 0;

	if (count >= 100)
	{
		cout << "通讯录存储已满。" << endl;
	}
	else
	{
		while (1)
		{
			flag = 0;
			cout << "请输入联系人的信息:" << endl;
			cout << "姓名:";
			cin >> info[count].Name;
			cout << "电话:";
			cin >> info[count].Telephone;
			cout << "Email:";
			cin >> info[count].Email;
			cout << "类型:";
			cin >> info[count].Type;
			count++;
			cout << "添加成功。" << endl;
			cout << "是否继续添加联系人? y/n:" << endl;
			cin >> ch;
			while (ch != 'n' && ch != 'y')
			{
				cout << "输入错误!请重新输入 y/n:" << endl;
				cin >> ch;
			}
			if (ch == 'n')
			{
				break;
			}
		}
	}
}

void People::search()
{
	while (1)
	{
		char name[20];
		int i = 0;
		char ch = 0;
		int flag = 0;
		cout << "通过姓名查找:" << endl;
		cin >> name;

		for (i = 0; i < count; i++)
		{
			if (strcmp(name, info[i].Name) == 0)
			{
				flag = 1;
				cout << "姓名:" << info[i].Name << endl;
				cout << "电话:" << info[i].Telephone << endl;
				cout << "Email:" << info[i].Email << endl;
				cout << "类型:" << info[i].Type << endl;
				cout << "***************************************" << endl;
			}
		}
		if (flag == 0)
		{
			cout << "查无此人!" << endl;
		}
		cout << "是否继续? y/n:" << endl;
		getchar();
		cin >> ch;
		while (ch != 'n' && ch != 'y')
		{
			while (getchar() != '\n');
			cout << "输入错误!请重新输入 y/n:" << endl;
			cin >> ch;
		}
		if (ch == 'n')
		{
			break;
		}
	}
}
void People::sort_search()
{
	while (1)
	{
		char type[20];
		int i = 0;
		char ch = 0;
		int flag = 0;
		cout << "请输入需要查找联系人的类别是" << endl;
		cin >> type;

		for (i = 0; i < count; i++)
		{
			if (strcmp(type, info[i].Type) == 0)
			{
				flag = 1;
				cout << "姓名:" << info[i].Name << endl;
				cout << "电话:" << info[i].Telephone << endl;
				cout << "Email:" << info[i].Email << endl;
				cout << "类型:" << info[i].Type << endl;
				cout << "***************************************" << endl;
			}
		}
		if (flag == 0)
		{
			cout << "暂无该类型的联系人!" << endl;
		}
		cout << "是否继续? y/n:" << endl;
		getchar();
		cin >> ch;
		while (ch != 'n' && ch != 'y')
		{
			while (getchar() != '\n');
			cout << "输入错误!请重新输入 y/n:" << endl;
			cin >> ch;
		}
		if (ch == 'n')
		{
			break;
		}
	}
}
void People::dele()
{
	char name[20] = { 0 };
	int i = 0;
	int j = 0;
	int num = 0;
	char ch = 0;
	int name_count[20] = { 0 };
	int number = 0;                           //删除的联系人的编号

	while (1)
	{
		num = 0;

		cout << "请输入要删除的联系人的姓名:" << endl;
		cin >> name;
		for (i = 0; i < count; i++)
		{
			if (strcmp(name, info[i].Name) == 0)
			{
				name_count[num] = i;//记录每一个要删除人的编号
				num++;
			}
		}
		if (num == 0)
		{
			cout << "查无此人!" << endl;
		}
		else
		{
			for (i = 0; i < num; i++)
			{
				cout << "编号:" << i << endl;
				cout << "姓名:" << info[name_count[i]].Name << endl;
				cout << "电话:" << info[name_count[i]].Telephone << endl;
				cout << "Email:" << info[name_count[i]].Email << endl;
				cout << "类型:" << info[name_count[i]].Type << endl;
				cout << "***************************************" << endl;
			}
			cout << "请输入你要删除联系人信息的编号" << endl;
			cin >> number;
			while (number < 0 || number >= num)
			{
				while (getchar() != '\n');
				cout << "输入错误! 请重新输入!" << endl;
				cin >> number;
			}

			while (name_count[number] < count)//把后面的联系人全部往前挪一个位置,覆盖掉被删除的人的信息
			{
				strcpy(info[name_count[number]].Name, info[name_count[number] + 1].Name);
				strcpy(info[name_count[number]].Telephone, info[name_count[number] + 1].Telephone);
				strcpy(info[name_count[number]].Email, info[name_count[number] + 1].Email);
				strcpy(info[name_count[number]].Type, info[name_count[number] + 1].Type);
				name_count[number]++;
			}

			count--;
			cout << "删除成功!" << endl;
		}
		cout << "是否继续? y/n:" << endl;
		getchar();
		cin >> ch;
		while (ch != 'n' && ch != 'y')
		{
			while (getchar() != '\n');
			cout << "输入错误!请重新输入 y/n:" << endl;
			cin >> ch;
		}
		if (ch == 'n')
		{
			break;
		}
	}
}

void People::change()
{
	char name[20] = { 0 };
	int i = 0;
	int j = 0;
	char ch = 0;
	int num = 0;                               // 用来确定删除的人的次序
	int name_count[10] = { 0 };

	while (1)
	{
		j = 0;
		cout << "请输入你要修改联系人的姓名:" << endl;
		cin >> name;
		for (i = 0; i < count; i++)
		{
			if (strcmp(info[i].Name, name) == 0) //判断同名人数
			{
				name_count[j] = i;
				j++;
			}
		}
		if (j == 0)                             //查无此人
		{
			cout << "查无此人!" << endl;
		}
		else if (j == 1)                        //名字唯一,直接修改 
		{
			cout << "修改的信息:" << endl;
			cout << "姓名: ";
			cin >> info[name_count[j - 1]].Name;
			cout << "电话 : ";
			cin >> info[name_count[j - 1]].Telephone;
			cout << "Email : ";
			cin >> info[name_count[j - 1]].Email;
			cout << "类型 : ";
			cin >> info[name_count[j - 1]].Type;
			cout << "修改成功!" << endl;
		}
		else                                    //有同名时,显示全部同名人的信息
		{
			cout << "有 " << j << " 个同名" << endl;
			for (i = 0; i < j; i++)
			{
				cout << "编号:" << i << endl;
				cout << "姓名:" << info[name_count[i]].Name << endl;
				cout << "电话:" << info[name_count[i]].Telephone << endl;
				cout << "Email:" << info[name_count[i]].Email << endl;
				cout << "类型:" << info[name_count[i]].Type << endl;
				cout << "***************************************" << endl;
			}
			cout << "请输入你要修改联系人的编号:" << endl;
			ch = getchar();
			cin >> num;
			while (num < 0 || num >= j)
			{
				while (getchar() != '\n');
				cout << "输入错误! 请重新输入:" << endl;
				cin >> num;
			}
			cout << "请输入修改后联系人的所有信息:" << endl;
			cout << "姓名: ";
			cin >> info[name_count[num]].Name;
			cout << "电话 : ";
			cin >> info[name_count[num]].Telephone;
			cout << "Email : ";
			cin >> info[name_count[num]].Email;
			cout << "备注 : ";
			cin >> info[name_count[num]].Type;
			cout << "修改成功!" << endl;
		}
		cout << "是否继续? y/n:" << endl;
		getchar();
		cin >> ch;
		while (ch != 'n' && ch != 'y')
		{
			while (getchar() != '\n');
			cout << "输入错误!请重新输入 y/n:" << endl;
			cin >> ch;
		}
		if (ch == 'n')
		{
			break;
		}
	}
}
void People::display()
{
	while (1)
	{
		int i = 0;
		char ch = 0;
		for (i = 0; i < count; i++)
		{
			cout << "姓名:" << info[i].Name << endl;
			cout << "电话:" << info[i].Telephone << endl;
			cout << "Email:" << info[i].Email << endl;
			cout << "备注:" << info[i].Type << endl;
			cout << "***************************************" << endl;
		}

		while (ch != 'q')
		{
			cout << "请输入 'q' 退出!" << endl;
			//ch = getchar();
			cin >> ch;
		}
		break;
	}
}
int main()
{
	People peo;
	int number = 0;
	char ch = 0;
	peo.initial();//初始化,读取文件中的数据到数组中
	while (1)
	{
		system("cls");
		number = peo.interface();
		system("cls");//清屏
		switch (number)
		{
		case 1:    //添加
		{
			peo.add();
			cout << "是否保存到文本文件?y/n:" << endl;
			getchar();
			cin >> ch;
			while (ch != 'n' && ch != 'y')
			{
				getchar();
				cout << "输入错误!请重新输入 y/n:" << endl;
				cin >> ch;
			}
			if (ch = 'y')
			{
				peo.save_info();
				cout << "保存成功!" << endl;
			}
			break;
		}
		case 2:    //查看
		{
			peo.search();
			break;
		}
		case 3:    //删除  
		{
			peo.dele();
			cout << "是否保存到文本文件?y/n:" << endl;
			getchar();
			cin >> ch;
			while (ch != 'n' && ch != 'y')
			{
				getchar();
				cout << "输入错误!请重新输入 y/n:" << endl;
				cin >> ch;
			}
			if (ch = 'y')
			{
				peo.save_info();
				cout << "保存成功!" << endl;
			}
			break;
			break;
		}
		case 4:    //修改
		{
			peo.change();
			cout << "是否保存到文本文件?y/n:" << endl;
			getchar();
			cin >> ch;
			while (ch != 'n' && ch != 'y')
			{
				getchar();
				cout << "输入错误!请重新输入 y/n:" << endl;
				cin >> ch;
			}
			if (ch = 'y')
			{
				peo.save_info();
				cout << "保存成功!" << endl;
			}
			break;
			break;
		}
		case 5:
		{
			peo.display();
			break;
		}
		case 6:
		{
			peo.sort_search();
			break;
		}
		case 7:    //退出
		{
			cout << "退出成功!\n" << endl;
			exit(0);
		}
		default:
		{
			printf("Please input right number!\n");
			ch = getchar();
			printf("Please input any key to continue.\n");
			ch = getchar();
			break;
		}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Yun_Ge/article/details/85255690