我在课堂上解决任务时遇到了一些问题。我解决问题的算法工作正常,但我的问题是将3个不同文本文件中的数据读入2个不同的类。
现在第一个文本文件“hours.txt”给出了一个字符串id和小时int,如下所示:
adam1;170
eve2;170
所以,用“;”分隔。 下一个文件包含与之前相同的ID和名称,出租车,类型,并根据类型:工资如果PH,或工资和ovtwage如果是。
adam1;Adam Driver;12345678;PH;5;
eve2;Eve Assistant;23456789;IS;650;10
第3个文件只包含int 160,它被定义为generalWorkingHours。现在我的问题出现了。我有从1个文件读取数据到1个类的经验,但在这种情况下,我必须将数据读取到2个类,ph,并且取决于id的类型(adam1和eve2)。我已经提供了两个这样的课程:
#ifndef IS_H
#define IS_H
#include "Employee.h"
#include <iostream>
using namespace std;
class is: public Employee
{
public:
is();
virtual ~is();
void setSalary(int salary);
int getSalary();
void setOvtWage(int ovtWage);
int getOvtWage();
protected:
private:
int salary;
int ovtWage;
};
#endif // IS_H
和
#ifndef PH_H
#define PH_H
#include "Employee.h"
#include <iostream>
using namespace std;
class ph: public Employee
{
public:
ph();
virtual ~ph();
void setWage(int wage);
int getWage();
protected:
private:
int wage;
};
#endif // PH_H
这两个类都包含公共“员工”
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
#include <iostream>
using namespace std;
class Employee
{
public:
Employee();
virtual ~Employee();
void setId(string id);
string getId();
void setName(string name);
string getName();
void setTaxId(string taxid);
string getTaxId();
void setType(string type);
string getType();
void setHours(int hours);
int getHours();
protected:
private:
string id;
string name;
string taxid;
string type;
int hours;
};
#endif // EMPLOYEE_H
现在,通常我会创建一个函数来读取一个文件,一个像这样解析每一行:
void Resolver::parseTextLine(string tmp, int & carCnt, carList X[]){
std::size_t found;
found=tmp.find(";");
if (found!=string::npos) {
X[carCnt].point=tmp.substr(0,found);
tmp=tmp.substr(found+1);
}
found=tmp.find(";");
if (found!=string::npos) {
X[carCnt].license=tmp.substr(0,found);
tmp=tmp.substr(found+1);
}
found=tmp.find(";");
if (found!=string::npos) {
X[carCnt].time=atoi(tmp.substr(0,found).c_str());
tmp=tmp.substr(found+1);
}
carCnt++;
}
void Resolver::readDataFromFiles(string carFile, int & carCnt, carList X[]){
carCnt=0;
ifstream finS(carFile.c_str(),ios::in);
bool first=true;
while (!finS.eof()) {
string tmp="";
getline(finS,tmp);
if (tmp!="") {
if (first) {
first=!first;
} else {
parseTextLine(tmp,carCnt,X);
}
}
}
finS.close();
}
注意:这只是我如何解决它的想法,但我没有使用多个文件和类的经验。所有功能都是预制的,我只需要以某种方式将它们拼凑在一起。
答案 0 :(得分:0)
map<string, Employee*> Emp;
这将存储id为索引的所有员工的信息(&#34; adam1&#34;,&#34; eve2&#34;)和作为价值的对象。[&#34; adam1&#34;] =&gt; [ph的对象]
[&#34; eve2&#34;] =&gt; [对象是]
现在,请阅读包含PH
和IS
信息的file_2。现在,对于每一行读取,您将所有组件分隔为&#34;;&#34;出现在线上。在从行中分离组件之后,您应该能够(使用type
)决定应该实例化哪个派生类。
if(type == PH)
{
//suppose id = "adam"
ph *pEmployeePH = new ph();
//also set wage
//insert [id] in map Emp if not already present
}
if(type == IS)
{
//suppose id is now "eve2"
is *pEmployeeIS = new is();
//also set salary and ovtwage
//insert [id] in map Emp if not already present
}
准备好map
后,立即阅读file_1。现在,对于每一行读取,您将有两个分量由&#34;;&#34;出现在线上。从行中分离组件后,您应该能够(使用id
)决定应该访问/修改map Emp
的哪个元素以设置小时数。
假设id是&#34; adam1&#34;和小时= 170,所以现在检查地图是否包含[&#34; adam1&#34;],如果确实包含,则按如下方式设置小时数:Emp[id].setHours(hours);