0
点赞
收藏
分享

微信扫一扫

C++ 49.基于多态的职工管理系统(5)——文件交互(读文件)、初始化数组

蓝莲听雨 2022-03-30 阅读 46

文件交互-读文件

功能描述:将文件中的内容读取到程序中
虽然我们实现了添加职工后保存到文件的操作,但是每次开始执行程序,并没有将文件中数据读取到程序中
而我们的程序功能中还有清空文件的需求
因此构造函数初始化数据的情况分为三种:
1. 第一次使用,文件未创建

在workerManager.h中添加新的成员属性m_FilelsEmpty标志文件是否为空

//判断文件是否为空 标志
	bool m_FileIsEmpty;

修改 workerManager.cpp中构造函数代码

WorkerManager::WorkerManager()
{
	//1. 文件不存在情况
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件
	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl;

		//初始化人数
		this->m_EmpNum = 0;

		//初始化数组指针
		this->m_EmpArray = NULL;

		//初始化文件是否为空
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}

删除文件后,测试文件不存在时初始化数据功能

2. 文件存在,但是数据被用户清空

在workerManager.cpp中的构造函数追加代码

//文件存在,并且没有记录
char ch;
ifs >> ch;//读到文件末尾
if (ifs.eof())//为真,则为空文件
{
	cout << "文件为空" << endl;
	this->m_EmpNum = 0;
	this->m_FileIsEmpty = true;
	this->m_EmpArray = NULL;
	ifs.close();
	return;
}

在文件创建后清空文件内容,并测试情况下初始化功能

再添加职工成功后添加一行

//更新职工不为空
this->m_FileIsEmpty = false;

3. 文件存在,并且保存职工的所有数据

1)获取记录的职工人数

在workerManager.h中添加成员函数

//统计人数
int get_EmpNum();

 2)在workerManager.cpp中实现

int WorkerManager::get_EmpNum()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//打开文件 读文件

	int id;
	string name;
	int dId;

	int num = 0;

	while (ifs >> id && ifs >> name && ifs >> dId)//数据存储是以空格的方式间隔开,读完一行记录一次
	{
		//记录人数
		num++;
	}
	ifs.close();
	return num;
}

  3)在workerManager.cpp构造函数 中继续追加代码

//3. 文件存在,并且保存职工的所有数据
	int num = this->get_EmpNum();
	cout << "职工个数为:" << num << endl;
	this->m_EmpNum = num;//更新成员属性

初始化数组

根据职工的数据以及职工数据,初始化workerManager中的Worker ** m_EmpArray指针
1)在workerManager.h中添加成员函数

//初始化 员工
	void init_Emp();

2)在workerManager.cpp中实现

void WorkerManager::init_Emp()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//打开文件,读文件

	int id;
	string name;
	int dId;

	int index = 0;

	while (ifs >> id && ifs >> name && ifs >> dId)//数据存储是以空格的方式间隔开,读完一行记录一次
	{
		//记录人数
		Worker * worker = NULL;
		//根据不同的部门Id创建不同的对象
		if (dId == 1)//普通员工
		{
			worker = new Employee(id, name, dId);
		}
		else if (dId == 2)//经理
		{
			worker = new Manager(id, name, dId);
		}
		else //老板
		{
			worker = new Boss(id, name, dId);
		}

		//存放在数组中
		this->m_EmpArray[index] = worker;
		index++;//数组中索引的位置
	}
}

3)在workerManager.cpp构造函数中继续追加代码

//根据职工数创建数组
	this->m_EmpArray = new Worker *[this->m_EmpNum];
	//初始化职工
	this->init_Emp();

	//测试代码
	for(int i=0;i<this->m_EmpNum;i++)
	{
		cout << "职工号" << this->m_EmpArray[i]->m_ID
			<< "职工姓名" << this->m_EmpArray[i]->m_Name
			<< "职工编号" << this->m_EmpArray[i]->m_DeptID << endl;
	}
举报

相关推荐

0 条评论