String parsen
-
Mit den Stream-Operatoren kommst du da schon relativ weit. Für anspruchsvolleres Parsen eignet sich Boost.Regex oder je nach dem sogar Boost.Spirit.
Fürs erste könnten dir diese beiden Threads hilfreich sein:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-210160.html
http://www.c-plusplus.net/forum/viewtopic-var-t-is-176361.htmlAchte besonders auf die Posts von Werner Salomon, er kennt sich nämlich sehr gut mit Streams aus.

-
Hallo
#include <iostream> #include <fstream> float convertToInt(std::string Num) { if((strlen(Num.c_str())) > 0) { int x = atoi(Num.c_str()); return x; } else { Num.clear(); return 0; } } std::string const getWord(std::string Line, int Pos) { std::vector<std::string> Vec; std::stringstream ss(Line); std::string Word, a; while(ss >> Word) Vec.push_back(Word); return (Pos+1 > Vec.size() ? "" : Vec[Pos] ); } int main() { std::ifstream File; std::string Line; File.open("my_ding_ding_dong.schkriptdatay", std::ios::in); if(File.fail()) std::cout<<"Nae, funzt nisch!"<<std::endl; File.clear(); while(!File.eof()) { getline(File, Line); const std::string act = getWord(Line, 0); if((getWord(Line, 0) == "b") && (getWord(Line, 1) == "e")) //Jup, is än befehlsnomä { std::string newLine = Line; unsigned short Zahl1 = convertToInt(getWord(newLine, 12); newLine.replace(newLine.find(","),1," "); unsigned short Zahl2 = convertToInt(getWord(newLine, 13); newLine.replace(newLine.find(","),1," "); unsigned short Zahl3 = convertToInt(getWord(newLine, 14); newLine.replace(newLine.find(","),1," "); unsigned short Zahl4 = convertToInt(getWord(newLine, 15); newLine.replace(newLine.find(","),1," "); unsigned short Zahl5 = convertToInt(getWord(newLine, 16); newLine.replace(newLine.find(","),1," "); unsigned short Zahl6 = convertToInt(getWord(newLine, 17); newLine.replace(newLine.find(","),1," "); unsigned short Zahl7 = convertToInt(getWord(newLine, 18); } } return 0; }Bin zu Faul zum testen, daher weiss ich nicht ob's so läuft.
Mfg.
way
-
danke für die super antworten

Durch den Boost-Artikel werde ich mich mal durchlesen, allerdings glaube ich dass das für mein (eher unkomplexes) vorhaben zu übertrieben ist....Die Lösung mit den Umleitungsoperatoren erscheint mir genau perfekt für die Sache.
herzlichen dank
-
lex+yacc oder flex+bison sollte nicht unerwaehnt bleiben :).
-
hab ich jetzt was überlesen oder stand gar nicht fest ob C oder C++ weil atoi
way schrieb:
float x = atoi(Num.c_str());
ist doch C
-
Steckt ein C in C++?
-
knivil schrieb:
Steckt ein C in C++?
dazu sag ich mal nicht, denn C != C++
-------------------------------------------
useless postcount +1
-
Hallo
wos wird desch hia...

Mfg.
way
-
way schrieb:
#include <iostream> #include <fstream> float convertToInt(std::string Num) { if((strlen(Num.c_str())) > 0) { float x = atoi(Num.c_str()); return x; } else { Num.clear(); return 0; } }convertToInt liefert ein float zurück?

int convertToInt(std::string Num) { int result = 0; if (!Num.empty()) { std::stringstream s(Num); s >> result; } return result; }
-
Hallo
Habe es vorhin auch gesehen, naja, wie gesagt, Code ist ungetestet...
Mfg.
way
-
Tim06TR schrieb:
knivil schrieb:
Steckt ein C in C++?
dazu sag ich mal nicht, denn C != C++
Wer behauptet denn C == C++? Es war eine rhetorische Frage: Selbstverstaendlich steckt ein C in C++ (und das nicht nur im Bezeichner (bis auf kleine Details)).
wos wird desch hia...
Keine Ahnung, mal schauen ...

-
knivil schrieb:
Steckt ein C in C++?
Da wir uns aber im C++-Forum befinden, ist sein Einwand schon berechtigt. Und
atoi()liefert beispielsweise im Fehlerfall einfach eine Null zurück, das finde ich etwas... suboptimal.Sowieso ist es mehr als sinnfrei, den
std::string-internenconst char*zu holen und daraufstrlen()anzuwenden, um die Länge des Strings zu erhalten. Naja, es ist überhaupt fraglich, ob ways Code brauchbar ist. Sei es die Deklaration nicht benötigter Variablen, der Aufruf vonclear()vor dem Verlassen des Scopes oder die hässliche Codeduplizierung. Von den restlichen Dingen einmal abgesehen.