1. 程式人生 > 其它 >基於多型的職工管理系統(9)------檔案互動-讀檔案

基於多型的職工管理系統(9)------檔案互動-讀檔案

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

執行程式,測試從檔案中獲取的資料

至此初始化資料功能完畢,測試程式碼可以註釋或刪除掉!