Fehler in Stringsuche und Ausgabe
-
Hallo zusammen,
ich durchsuche zeilenweise eine Textdatei nach einem R1. Falls dieser gefunden wird, soll er gespeichert werden. Hier unter "reins":
if( strstr(Zeile,"R1=")) // Suchen des Parameters der Ausgaben { teins = Zeile; int pos = teins.find("="); // Umwandlung String in Zahl if(pos != string::npos) { subeins = teins.substr (pos + 1); Streins << subeins; Streins >> reins; fprint (fpOut, %f, reins) } }dies funktioniert soweit. Wenn allerdings mehrere R1 vorkommen, wird immer nur 0 ausgegeben ?! Ich habe schon versucht die Strings zu löschen etc. Hier mal komplett mit Deklaration:
int reins=0; string teins; string subeins; if( strstr(Zeile,"R1=")) // Suchen des Parameters der Ausgaben { teins = Zeile; int pos = teins.find("="); // Umwandlung String in Zahl if(pos != string::npos) { subeins = teins.substr (pos + 1); Streins << subeins; Streins >> reins; fprint (fpOut, %f, reins) teins.erase(); subeins.erase(); reins = 0; } }Input:
R1=230
R1=300Output:
230.00000
0.000000Wo liegt der Fehler bzw. warum funktioniert das nicht bei mehreren R1 ?
Danke im Voraus !!
-
Falsches Formatsymbol für integer, da kann alles Mögliche angezeigt werden. Am besten du ersetzt fprint durch die entsprechende C++ Streamklasse.
Edit:
Der Code ist reichlich unübersichtlich, am besten, du initialisierst die Variablen da, wo sie gebraucht werden. Und eine sinnvolle Benennung wäre auch ganz gut, ich musste selbst bei den drei Zeilen schon gucken, was reins, teins, subeins und Streins eigentlich sind.
-
Stimmt der Fehler ist aber nur im Forum-Quelltext, da ich diese Zeile von
Hand reingeschrieben habe.fprint (fpOut, %i, reins)Mich wundert es halt nur, dass es beim ersten Anzeigen von R1 richtig funktioniert und beim zweiten Mal nicht mehr. Deshalb dachte ich es liegt an den Strings, die gelöscht werden müssen ?!
Und ja die Variablen muss ich noch besser beschreiben !!
Hat sonst noch einer einen Tipp ?! Es muss doch möglich sein, den Parameter zu speichern, ihn dann auszugeben und bei einem weiteren Vorkommen, dies zu wiederholen...

-
sry meine natürlich:
fprint (fpOut, %d, reins)
-
Benji2010 schrieb:
Hat sonst noch einer einen Tipp ?!
Hör auf DocShoe!
-
Damit "mehrere" gefunden werden, würde ich so etwas wie "for" oder "while" erwarten. Das ist in deinem Code aber nicht vorhanden ...
-
Leider weiß ich trotz googlen nicht was:
"Am besten du ersetzt fprint durch die entsprechende C++ Streamklasse"
Könnte mir das mal einer kurz erklären ?
-
Wenn das garantiert immer RX=XXX ist, dann würde ich boost::tokenizer verwenden. Weil du hast dann alle Werte schön sortiert in einem iterationsfähigen Container.
void parse(std::string& file) { std::ifstream stream; stream.open(file.c_str()); if ( stream.is_open() ) { std::string line; while ( !stream.eof() ) { // Read line std::getline(stream, line); if ( !line.empty() ) { // Tokenize string const boost::char_delimiters_separator<char> sep(" ", "="); boost::tokenizer<> tokenizer(line, sep); boost::tokenizer<>::iterator it = tokenizer.begin(); std::string r = *it; if ( it+2 != tokenizer.end() && r == "R1" ) { std::string sVal = *(it+2); int value = boost::lexical_cast<int>(sVal); std::cout << sVal << "\t:\t" << value << std::endl; } } } } }Nicht getestet, aber ungefähr so sollte es funzen :).