Zeichenkette in verschiedene Variablen aufteilen
-
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