2013-11-26 87 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>