bestimmten teil aus string holen
-
Hallo,
ich hab folgendes problem.
habe eine .txt datei, in der ich aus jeder zeile einen gewissen teil rausfiltern will.
z.b.
lkadsjflkaf alksdjfl dkllsd <kjlkjsdf> ksdfl skdlfklsfdldkljfds
sdlkfjlksdf klsdfjkl <lkdjsf> aklsdjfkljsfkljlsdfs dkfldsjlsdjkl slkdfj
usw...ich les jede zeile in einen string mit getline ein...
leider weiß ich jetzt nicht genau, wie ich den teil zwischen den <> schön rausholen und in eine andere datei packen kann.
Kann mir da jemand helfen?
zudem weiß ich nicht, ob des alles so ne gute idee ist, weil die .txt datei, aus der ich des zeug auslesen will ca. 300mb groß ist und die neue datei auch etwas länger wird, weil ich des ausgelesene in eine neue .txt datei packen will.
is des überhaupt so sinnvoll?gruß
peter
-
Du nimmst dir die String-Methode find(), um die beiden Trennzeichen '<' bzw. '>' zu suchen. Danach kannst du per substr() den Teilbereich dazwischen ausschneiden und weiterverarbeiten.
-
peterli schrieb:
zudem weiß ich nicht, ob des alles so ne gute idee ist, weil die .txt datei, aus der ich des zeug auslesen will ca. 300mb groß ist ....
eine 300mb grosse .txt-Datei lol wie geil, was soll den da alles drin stehen???

Gruß Tobi
-
Hallo Peter,
getline - also das Einlesen einer Zeile - ist im Grunde nur dann notwendig, wenn die Zeilen auch der Formatierung dienen. Das ist hier anscheinend nicht der Fall. Es reicht also alles bis '<' zu (über-)lesen und dann den Text bis '>'.
Etwa so:
#include <iostream> #include <fstream> #include <algorithm> // find #include <iterator> // istream_iterator #include <string> int main() { using namespace std; ifstream datei("input.txt"); for( istream_iterator< char > i ; (i = find( istream_iterator< char >( datei ), istream_iterator< char >(), '<' )) != istream_iterator< char >(); ) { string txt; getline( datei, txt, datei.widen('>') ); // lese alles bis '>' // mache irgendwas mit 'txt' cout << "[" << txt << "]" << endl; } return 0; }Gruß
Werner
-
Hab' mich vom find iritieren lassen. ignore ist natürlich die schlauere Alternative.
#include <iostream> #include <fstream> #include <limits> #include <string> int main() { using namespace std; ifstream datei("input.txt"); for( ; datei.ignore( numeric_limits< streamsize >::max(), ifstream::traits_type::to_int_type( datei.widen('<') ) ) && !datei.eof(); ) { string txt; getline( datei, txt, datei.widen('>') ); // mache irgendwas mit 'txt' cout << "[" << txt << "]" << endl; } return 0; }Frage an die Profies: Ist das widen('<') im ignore-Aufruf korrekt?
Gruß
Werner
-
Korrekt ja, aber unnötig. ignore() und getline() erwarten das Trennzeichen als char, also mußt du das nicht per widen() maskieren.
-
hi
vielen dank!
hat mir sehr gut geholfen!!gruß
peter