奇怪的问题,但很难说,但是我可以说我有一个2个文件,其中包含一些双变量字符串将出现在顶部的文件中,然后是相应的双变量,如:
File1 =
A B C D E
1.2 3.4 4.5 5.6 7.8
文件2 =
B D E
9.8 7.6 5.4
我有一个双打结构
struct numb{
double A,B,C,D,E};
是否可以读入文件1(A B C D E)中的字符串,并且字符串中的第一个值是(A)将其分配给相应的结构值numb.A.
然后它将在字符串(B)的第一个值中读取下一个文件并将其分配给numb.B. 我意识到这可能是一堆if语句,但我想知道是否有更简单的方法。最难的部分是变量串总是A,B,C,D,E的某种组合。我在C ++ VS10中编程
答案 0 :(得分:2)
您可以使用要解析的字符串作为关键字创建一个地图,并将结构的相应属性pointer to member创建为值。
std::map<std::string, double numb::*> mapLetterToCorrespondingAttribute;
然后解析文件并将值分配给地图中与您解析的字母对应的键所指向的对应成员。
在您说不明白之前多次阅读:D
答案 1 :(得分:0)
switch
可能是最简单的方法。
void set_member(numb &n, char member, double value)
{
switch (member) {
case 'A':
n.A = value;
break;
case 'B':
n.B = value;
break;
// etc.
default:
// handle error
}
}
答案 2 :(得分:0)
在struct numb
中声明一个double数组。
struct numb {
void setValue(char label, double val) { value[label-'A'] = val; }
double getValue(char label) const { return value[label-'A']; }
double value[5];
};
然后,你可以执行:
numb n;
n.setValue('A', 1.2);
double A = n.getValue('A');
答案 3 :(得分:0)
将这两行读入std::vector<std::string>
,然后将它们成对地放入地图中:
std::vector<std::string> vars; // the split up first line
std::vector<std::string> values; // split up second line
std::map<std::string, double> mapping;
for (int i = 0; i < vars.size(); ++i) {
mapping.insert(std::make_pair(vars[i], boost::lexical_cast<double>(values[i]));
}
如果您使用合理的默认值预先填充地图mapping
,这应该非常简单。此外,您可以使用您喜欢的任何转化方法将来电替换为boost::lexical_cast<double>
。