基於多型的職工管理系統(9)------檔案互動-讀檔案
阿新 • • 發佈:2021-06-24
功能描述:將檔案中的內容讀取到程式中
雖然我們實現了新增職工後儲存到檔案的操作,但是每次開始執行程式,並沒有將檔案中資料讀取到程式中
而我們的程式功能中還有清空檔案的需求
因此建構函式初始化資料的情況分為三種
-
第一次使用,檔案未建立
-
檔案存在,但是資料被使用者清空
-
檔案存在,並且儲存職工的所有資料
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; } }
刪除檔案後,測試檔案不存在時初始化資料功能
在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.1 獲取記錄的職工人數
在workerManager.h中新增成員函式
//統計人數 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; //更新成員屬性
手動新增一些職工資料,測試獲取職工數量函式
根據職工的資料以及職工資料,初始化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; }
執行程式,測試從檔案中獲取的資料