文件交互-读文件
功能描述:将文件中的内容读取到程序中
虽然我们实现了添加职工后保存到文件的操作,但是每次开始执行程序,并没有将文件中数据读取到程序中
而我们的程序功能中还有清空文件的需求
因此构造函数初始化数据的情况分为三种:
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;
}