Zeichenkette in verschiedene Variablen aufteilen
-
Hallo!
Ich lese folgende Zeile (als string; beispielhaft) ein:
"12____1____2____2.0E-3______1.0E-3____0.0_____0"
enthalten sind immer diese 6 Informationen, die durch eine Reihe Leerzeichen (unbekannter Anzahl, hier als unterstrich dargestellt) getrennt sind.
Diese will ich nur in 6 einzelne Variable aufteilen (also Leerzeichen entfernen und typ umwandeln).
Ziel sollen 4 integer und 2 float werte sein.
Bin im c++ nicht so fit, wäre toll, wenn ich eine kurze antwort (quelltext) bekommen könnte!Danke im vorraus
Micha
-
Ist die Reihenfolge immer die selbe, also immer "int,int,int,float,float,int" ?
-
Schreib dir nen eigenen Parser der genau deine Anforderungen erfüllt.
http://de.wikipedia.org/wiki/ParserAllerdings 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