Zeichenkette in verschiedene Variablen aufteilen



  • Schreib dir nen eigenen Parser der genau deine Anforderungen erfüllt.
    ➡ http://de.wikipedia.org/wiki/Parser

    Allerdings müsstest du dann definitiv wissen wie die Ketten immer ausschaun, ob sie also immer den gleichen aufbau haben und so.

    Gruß Tobi.



  • Wenn die Zeichenkette dem standard entspricht sollte es einfach so gehen:

    int a1,a2,a3,a4;
    float f1,f2,f3;
    
    cin>>a1>>a2>>a3>>f1>>f2>>f3>>a4;
    

    leerzeichenfolgen werden vorher immer entfernt.



  • Hat immer gleiche struktur ...
    so einfach??? mhhh... im pascal war das immer ein handstand und rumbasteln an der zeichenkette... ich probiers mal!

    Micha



  • So ist die Reihenfolge gleichgültig.-Es müssen einfach genau 4 Integer- und 3 Float-Werte sein und dazwischen ausschliesslich Leerzeichen:

    #include <cstdlib>
    
    typedef struct{
    	float float_values[3];
    	int int_values[4];
    }str_values;
    
    str_values get_values(std::string str){
    	str_values ret_values;
    	std::string cur_val;
    	for(unsigned long cnt=0;cnt<=str.length();++cnt){
    		if(str[cnt]!=' '&&str[cnt]!='\0'){
    			cur_val.append(str.substr(cnt,1));
    		}
    		else{
    			if(!cur_val.empty()){
    				if(cur_val.find('.')!=-1){
    					static unsigned char f_values=0;
    					ret_values.float_values[f_values++]=(float)atof(cur_val.c_str());
    				}
    				else{
    					static unsigned char i_values=0;
    					ret_values.int_values[i_values++]=atoi(cur_val.c_str());
    				}
    			}
    			cur_val.clear();
    		}
    	}
    	return ret_values;
    }
    


  • So könntest du das z. B. verwenden:

    int main(void){
    	str_values values=get_values("12    1    2    2.0E-3      1.0E-3    0.0     0"););
    
    	std::cout
    		<<"1. Itegervalue: "<<values.int_values[0]<<std::endl
    		<<"2. Itegervalue: "<<values.int_values[1]<<std::endl
    		<<"3. Itegervalue: "<<values.int_values[2]<<std::endl
    		<<"4. Itegervalue: "<<values.int_values[3]<<std::endl
    		<<std::endl
    		<<"1. Floatvalue:  "<<values.float_values[0]<<std::endl
    		<<"2. Floatvalue:  "<<values.float_values[1]<<std::endl
    		<<"3. Floatvalue:  "<<values.float_values[2]<<std::endl;
    	std::cin.get();
    }
    


  • So, Guten Morgen

    Also der Code funktioniert grundsätzlich, danke schon mal!

    ich packe die sache in eine schleife, um eine reihe von zeilen auf diese art und weise umzuwandeln (=> zeilenweiser stream)
    beim ersten durchlauf passt es auch, nur bei den weiteren nicht mehr... da kommt nur noch unsinn bei rum...

    struktur:

    for(i)
    {
        file.getline(textzeile,80);
        str_values values=get_values(textzeile);
        var[i].Set_intvalue_1(values.int_values[1]);
    }
    

    'textzeile' enthält immer die passende zeichenkette als string, kein char*)

    Micha



  • nur mal als anmerkung: die Beispielzeile in deinem startpost wurde(natürlich bei ersetzung von "_" durch " ") von den streams perfekt ausgewertet.



  • Ja, keine Frage, habe ich ja eben auch so gepostet...
    Nur hab ich ein Problem damit mich in fremden Code einzulesen...

    Micha



  • int a1,a2,a3,a4;
    float f1,f2,f3; 
    std::string line = "12    1    2    2.0E-3      1.0E-3    0.0     0";
    std::stringstream stream(line);
    stream>>a1>>a2>>a3>>f1>>f2>>f3>>a4;
    


  • DANKE !
    an alle Beteiligte, jetzt hab ichs im Kasten...
    ... da die Schnittstelle programmiert ist kann ich mich endlich ums fachliche kümmern 😉

    Micha


Anmelden zum Antworten