附上读取文件数据代码的模板笔记
在该案例中我们读取文件中的数据有3种情况,要根据3种不同的情况来编辑相应的编码,我们的读取文件操作是写在管理类的构造函数中,这样在程序一开始便会自动的读取文件中的数据。
首先我们创建输入流函数,再通过输入流函数打开文件
//定义输入流对象
ifstream ifs;
//以读文件的形式打开文件
ifs.open(FILENAME, ios::in);
1.文件不存在(在判断文件情况的同时也不用忘记这里是管理类的构造函数,要初始化管理类的属性)
//文件不存在
if (!ifs.is_open())
{
cout << "文件不存在" << endl;
//整个数组内信息的个数
this->m_Empnum = 0;
//原来已经储存的数据后面空位的下标
this->m_oldnum = 0;
//指向数据表的指针
this->m_EmpArray = NULL;
//判断文件是否为空
this->FileIsEmpty = true;
//关闭文件
ifs.close();
//文件不存在就return掉,不进行操作
//如果不return则会进入下面构造函数的操作,造成错误
return;
}
is_open()函数可以判断文件是否打开成功,如果打开成功该函数返回true,反之返回false。于是这里用输入流对象ifs调用is_open()函数。
2.文件存在但文件中没有信息
//2.文件存在但没有数据
char ch;
ifs >> ch;
if (ifs.eof())
{
//文件为空
cout << "文件为空" << endl;
//整个数组内信息的个数
this->m_Empnum = 0;
//原来已经储存的数据后面空位的下标
this->m_oldnum = 0;
//指向数据表的指针
this->m_EmpArray = NULL;
//判断文件是否为空
this->FileIsEmpty = true;
//关闭文件
ifs.close();
//文件不存在就return掉,不进行操作
return;
}
当文件为空时,文件中只会剩下一个EOF结尾字符,用输入流对象读取文件中的一个字符,再调用eof()函数,如果调用eof函数后返回true就说明文件的确为空
3.文件存在且文件中有数据
上面两个情况都不是就说明肯定是第三种情况,所以我们在第三种情况中就要将文件中的数据读取到程序中,由于我们在设计程序输入功能时,在程序中储存信息的数组是动态创建的,所以我们事先要知道文件中的数据个数,先创建好相应的空间才能开始读取文件中的数据‘
定义一个获得文件中数据个数的功能
//统计文件中的个数
//因为本程序在设计的时候数组的空间是动态开辟的,所以我们准备在程序中接受文件中的代码时,就必须事先知道文件中的数据的个数,才能创建相应的储存空间
int WorkerManager::Get_Empnum()
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
//要把遍历读到的数据暂时放到临时变量中
int id;
string name;
int deptid;
//计数器
int num = 0;
//直接将读取操作写到while的判断条件中,这样当无法读取后便会跳出while循环
while (ifs>>id&&ifs>>name&&ifs>>deptid)
{
//统计有几行记录
num++;
}
ifs.close();
return num;
}
这里将读取的功能直接作为while的判断条件,这样就很灵活,在读取操作完成后便自动退出了while循环,遍历完了文件中的数据,获得了文件中职工的个数。
ifs>>id&&ifs>>name&&ifs>>deptid 实现了一行一行的读取数据,一行的数据便是一个职工
获得了文件中职工的数目后我们便可以在程序中创建相应大小的数组空间
this->FileIsEmpty = false;
//获得文件中的数据个数
this->m_Empnum = this->Get_Empnum();
cout << "职工人数为:" << this->m_Empnum << endl;
//原来已经储存的数据后面空位的下标
this->m_oldnum = this->m_Empnum;
//开辟一个数组空间
this->m_EmpArray = new Worker * [this->m_Empnum];
开辟空间后我们便可以包装读文件的功能
//读取文件数据
void WorkerManager::Init_Emp()
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
int id;
string name;
int deptid;
Worker* worker;
int i=0;
while (ifs >> id && ifs >> name && ifs >> deptid)
{
//判断从文件中得到的数据的类型,来创建相应对象的空间
if (deptid == 1)
{
//将从文件中读得的数据存放
worker = new Employee(id, name, deptid);
}
else if (deptid == 2)
{
worker = new Manager(id, name, deptid);
}
else
{
worker = new Boss(id, name, deptid);
}
this->m_EmpArray[i++] = worker;
}
ifs.close();
}
下篇