String mit boost (komplizierter) splitten
-
Wäre schön wenn jemand einen Rat für mich hätte bezüglich des folgenden Problems: In einer Input-Datei soll eine Zeile mit x,y-Parametern (doubles) eingelesen werden, die bspw. wie folgt aussieht:
BetaST (0.0/120.) (0.5/140.) (0.9/155.5) (1.0/165.5) # kommentar: diese Zeile wird schon richtig eingelesen (ausser dem Kommentar)
BetaST (0.0 120.) ( 0.5/ 140.) (0.9/155.5) (1.0/165.5) # kommentar: geht nicht wegen den blanks in den geklammerten Ausdruecken"BetaST" ist der Parametername, in den Klammern folgen dann die x- und y-werte. Wundervoll wäre es auch, wenn man mit # noch Kommentare einfügen könnte. Bislang läuft das Ganze mit dem boost tokenizer, wobei in den Klammern keine Blanks/Tabs eingebracht werden können und auch keine Kommentare.
Man müsste die Zeile zuerst nach den Klammern zerlegen, den Kommentar abschneiden und vorallem auch Tokens mit blanks/tabs usw. entfernen. Da weiss ich mir nicht so recht zu helfen und hoffe auf Eure Hilfe und Erfahrung. Danke vielmals!
// for boost-tokenizer typedef boost::tokenizer<boost::char_separator<char> >tokenizer; // Specification of Separators boost::char_separator<char> sep(",= \t\n"); // Separator for radialDistribution Parameters boost::char_separator<char> sepBracks(" \t()|[]{}"); boost::char_separator<char> sepXY("/|:"); // Oeffne Parameter-File ifstream file(inputFileName.data()); if (file.fail()) { cerr << "ERROR: Unable to open file" << file <<" for reading." << endl; exit(1); } while( getline(file,line) ) { // cout << "Zeile =" << line << endl; tokenizer tokens(line, sep); vector<string> tokenArray( tokens.begin(), tokens.end() ) ; if (tokenArray.size()<1) continue; else if ( tokenArray[0] == "betaST" ) { tokenizer tokens(line, sepBracks); vector<string> tokenArrayRadParams1( tokens.begin(), tokens.end() ); cout << "\t- \"betaST\" by " << tokenArrayRadParams1.size()-1 << " values: " << endl; for (i=1; i<(int)tokenArrayRadParams1.size(); i++) { tokenizer tokens2(tokenArrayRadParams1[i], sepXY); vector<string> tokenArrayRadParams2( tokens2.begin(), tokens2.end() ); point.x = atof(tokenArrayRadParams2[0].data()); point.y = atof(tokenArrayRadParams2[1].data()); point.z = 0.0; radDist_betaST->AppendPoint(point); } cout << "\t\tradHeight \t= "; for (i=0; i<(int)tokenArrayRadParams1.size()-1; i++) cout << radDist_betaST->m_P.At(i)->x << "\t"; cout << endl; cout << "\t\tparamValue \t= "; for (i=0; i<(int)tokenArrayRadParams1.size()-1; i++) cout << radDist_betaST->m_P.At(i)->y << "\t"; cout << endl; continue; } }
-
dafür ist boost::spirit eigentlich total Klasse.