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.


Anmelden zum Antworten