2013-11-26 88 views
0

奇怪的问题和难以言表,但让我们说,我有一个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

+2

一切都可能在C++! – JBL

+0

如果A B C等实际上是配置值,我会建议你编写一个通用的可用类来处理任意字符串/名称。示例:http://www.appinf.com/docs/poco/Poco.Util.AbstractConfiguration.html http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html – Paranaix

回答

0

A 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 
    } 
} 
0

struct numb中声明一个双精度数组。

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'); 
1

您可以创建一个字符串的地图解析为重点,你的结构作为值对应的属性的pointer to member

std::map<std::string, double numb::*> mapLetterToCorrespondingAttribute; 

然后解析您的文件和相应的成员指出,在地图对应键为您解析了信中的值赋值。

你说你不明白之前,请阅读此多次:d

+0

一个很好的补充:在你的类中公开这个映射或者提供一个使用这个映射来实现的方法(甚至更好)。 – Paranaix

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>