.txt Datei - Jede zweite Zeile "auslassen"
-
Huhu,
Dankesehr, funktioniert einwandfrei. Irgendwas mit numeric_limits hatte ich noch im Kopf, schonmal in anderen Threads gelesen.
In dem Fall wäre die Sache so weit geklärt. Man lernt nie aus...
mfg
HarteWareEDIT: Ein Problem hätte ich noch:
Zeile beginnt mit string
a
a
b
a
b
a
a
etc. (kein festes Muster)ich will nur Zeilen haben mit Anfangsstring a. Die anderen ist nicht wichtig.
Nun habe ich Sachen versucht wie
Nur wenn: string[4] == "char, welchen nur string a an fünfter Stelle hat" Dann: schreib in die DateiJedoch klappt es nicht. Es werden weiterhin alle strings aus dem vector in die Datei geschrieben... Wie würde man korrekter Weise sowas angehen?
-
Dann liest du auch nur die Zeilen ein, die du haben willst:
while (std::getline(file, line)) { if (line[0] == 'a') lines.push_back(std::move(line)); }
-
Nathan schrieb:
Dann liest du auch nur die Zeilen ein, die du haben willst:
while (std::getline(file, line)) { if (line[0] == 'a') lines.push_back(std::move(line)); }std::string line; while( std::getline( file, line )) { if( line[4] == 'n' ) temp_lines.push_back( line ); file.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); }wobei gewollter "Startstring Teil" (ST) -> "Login" und ungewollter ST -> "Log Out"
Der vector bleibt leider leer, das war auch mein Ansatz (sowohl beim Schreiben probiert, als auch beim Lesen)...
mfg
HarteWare
-
HarteWare schrieb:
Der vector bleibt leider leer[..]
Klar, Du ignorierst ja auch nicht die Zeile, die Du geprüft hast.
-
Bitte schreib nicht so etwas:
std::getline( file, line ) if( line[4] == 'n' ) // ...Das schreit ja geradezu nach Ärger. Besser:
std::getline( file, line ) if( line.length() > 4 && line[4] == 'n' ) // ...
-
SeppJ schrieb:
Das schreit ja geradezu nach Ärger. Besser:
std::getline( file, line ) if( line.length() > 4 && line[4] == 'n' ) // ...Das ist auch nicht richtig, wenn der Stream in einem Fehlerstatus ist.
-
Schreihals schrieb:
SeppJ schrieb:
Das schreit ja geradezu nach Ärger. Besser:
std::getline( file, line ) if( line.length() > 4 && line[4] == 'n' ) // ...Das ist auch nicht richtig, wenn der Stream in einem Fehlerstatus ist.
Das ist nur als ungefähre Richtungsangabe zu verstehen, ich wollte jetzt nicht noch eine weitere Ebene an Abfragen hinzu fügen. Aber guter Hinweis an Leute, die das Beispiel zu wörtlich genommen hätten.
-
Hallo,
Caligulaminus schrieb:
HarteWare schrieb:
Der vector bleibt leider leer[..]
Klar, Du ignorierst ja auch nicht die Zeile, die Du geprüft hast.
Wie ist das zu verstehen? So? Denke ich hab das so falsch verstanden...
std::string line; while( std::getline(file,line) ) { if( line.length() > 4 && line[4] == 'n') { temp_lines.push_back( line ); // move ist optional file.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); } file.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); }Stimmt, das Programm ist relativ gesehen recht unzuverlässlich und auch nicht wirklich universell verwendbar, aber ich möchte es nur für eine ganz bestimmte Aufgabe. Aber Danke für die Hinweise, nichts spricht dagegen sauber zu arbeiten.
mfg
HarteWare
-
Der stream hat einen Marker für die aktuelle Leseposition.
Beigetline(..., '\n')wird der Marker auf die nächste Zeile gesetzt (und der Inhalt zwischen der vorherigen Position und der aktuellen in einen String gespeichert).
Beiignore(..., '\n')wird der Marker (nur) auf die nächste Zeile gesetzt.Gegeben sei folgender Dateiinhalt:
0123m 0123n 0123oWo steht der Lesemarker nach dem ersten Schleifendurchlauf? Welchen Inhalt hat line?
Wie sieht es nach dem zweiten Durchlauf aus?std::string line; while( std::getline(file,line) ) { if( line.length() > 4 && line[4] == 'n') { temp_lines.push_back( line ); // move ist optional file.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); } file.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); }Fällt Dir was auf?
-
std::string mystring;
mystring = "blablabla"if(mystring[3] == 'a')
writeToFile(mystring);
-
Namenloser324 schrieb:
std::string mystring;
mystring = "blablabla"if(mystring[3] == 'a')
writeToFile(mystring);oh lol hab die zweite Seite nicht gesehen haha einfach ignorieren
-
Furble Wurble schrieb:
Gegeben sei folgender Dateiinhalt:
0123m 0123n 0123oWo steht der Lesemarker nach dem ersten Schleifendurchlauf? Welchen Inhalt hat line?
Wie sieht es nach dem zweiten Durchlauf aus?Fällt Dir was auf?
Hallo,
Also als erstes fällt mir auf, dass dieser Thread theoretisch nach Natans Post schon hätte gelöst sein sollen, jedoch ist dem in der Praxis nicht so...

Na gut:
Nach dem ersten Durchlauf:0123m 0123n 0123o <- Lesemarker Inhalt: "0123m"Nach dem Zweiten:
nada, std::getline wird fehlschlagenwhile( getline( file, line )) // Diese Zeile schlägt fehl. Habs getestet. //====================================== while( std::getline( file, line )) { std::cout << line << '\n'; }Output:
Press <RETURN> to close this window...Ich finds echt toll, das so durchhaltend versucht wird mir zu helfen
mfg
HarteWare
-
HarteWare schrieb:
Also als erstes fällt mir auf, dass dieser Thread theoretisch nach Natans Post schon hätte gelöst sein sollen, jedoch ist dem in der Praxis nicht so...

Na gut:
Nach dem ersten Durchlauf:0123m 0123n 0123o <- Lesemarker Inhalt: "0123m"Nach dem Zweiten:
nada, std::getline wird fehlschlagenSicher?
Hast Du's mal ausprobiert?HarteWare schrieb:
while( getline( file, line )) // Diese Zeile schlägt fehl. Habs getestet. //====================================== while( std::getline( file, line )) { std::cout << line << '\n'; }Output:
Press <RETURN> to close this window...Das sollte eigentlich jede Zeile eines Files ausgeben.
Wenn Du jetzt noch die gesuchten Zeilen in einen Vektor einfügst ist die Aufgabe doch gelöst?!
-
oh man... kann es sein, dass es ihm net passt, wenn vor jeder Zeile im Dokument noch en bissle whitespace ist? Naja das Einlesen hat sich nun geklärt...
Ich möcht mich nochmals bei allen Helfenden bedanken

mfg
HarteWare