基于多态的职工管理系统------文件交互-读文件

Posted 千城明黛子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于多态的职工管理系统------文件交互-读文件相关的知识,希望对你有一定的参考价值。

9、文件交互 - 读文件

功能描述:将文件中的内容读取到程序中

虽然我们实现了添加职工后保存到文件的操作,但是每次开始运行程序,并没有将文件中数据读取到程序中

而我们的程序功能中还有清空文件的需求

因此构造函数初始化数据的情况分为三种

 

  1. 第一次使用,文件未创建

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

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

 

9.1 文件未创建

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

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

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

WorkerManager::WorkerManager()
{
    ifstream ifs;
    ifs.open(FILENAME, ios::in);

    //文件不存在情况
    if (!ifs.is_open())
    {
        cout << "文件不存在" << endl; //测试输出
        this->m_EmpNum = 0;  //初始化人数
        this->m_FileIsEmpty = true; //初始化文件为空标志
        this->m_EmpArray = NULL; //初始化数组
        ifs.close(); //关闭文件
        return;
    }
}

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

9.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;
    }

追加代码位置如图:

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

 

我们发现文件不存在或者为空清空 m_FileIsEmpty 判断文件是否为空的标志都为真,那何时为假?

成功添加职工后,应该更改文件不为空的标志

void WorkerManager::Add_Emp()成员函数中添加:

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

9.3 文件存在且保存职工数据

9.3.1 获取记录的职工人数

在workerManager.h中添加成员函数 int get_EmpNum();

    //统计人数
    int get_EmpNum();

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;
}

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

int num =  this->get_EmpNum();
    cout << "职工个数为:" << num << endl;  //测试代码
    this->m_EmpNum = num;  //更新成员属性 

手动添加一些职工数据,测试获取职工数量函数

9.3.2 初始化数组

根据职工的数据以及职工数据,初始化workerManager中的Worker ** m_EmpArray 指针

 

在WorkerManager.h中添加成员函数 void init_Emp();

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

在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)  // 1普通员工
        {
            worker = new Employee(id, name, dId);
        }
        else if (dId == 2) //2经理
        {
            worker = new Manager(id, name, dId);
        }
        else //总裁
        {
            worker = new Boss(id, name, dId);
        }
        //存放在数组中
        this->m_EmpArray[index] = worker;
        index++;
    }
}

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

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

    //测试代码
    for (int i = 0; i < m_EmpNum; i++)
    {
        cout << "职工号: " << this->m_EmpArray[i]->m_Id
            << " 职工姓名: " << this->m_EmpArray[i]->m_Name
            << " 部门编号: " << this->m_EmpArray[i]->m_DeptId << endl;
    }

运行程序,测试从文件中获取的数据

至此初始化数据功能完毕,测试代码可以注释或删除掉!

 

以上是关于基于多态的职工管理系统------文件交互-读文件的主要内容,如果未能解决你的问题,请参考以下文章

黑马程序员C++ 教程从0到1入门--c++编程实例 基于多态的职工管理系统

C++项目实战:基于多态的职工管理系统(源码)

c++初学者动手实践项目:职工系统管理(上)

职工信息管理系统完善版(C++面向对象实现)

C++C++实现职工管理系统

C++基础实战:职工管理系统