find und replace von CR/LF
-
Es gibt eine schöne Lösung mit Stream-Iteratoren:
#include <iostream> #include <algorithm> #include <iterator> #include <fstream> int main() { std::ifstream iStream("Beha.esca"); std::ofstream tempStream("Beha.txt"); std::replace_copy( std::istream_iterator<char>(iStream >> std::noskipws), std::istream_iterator<char>(), std::ostream_iterator<char>(tempStream), '\n', '\t' ); }
(Ungetestet)
Edit: noskipws eingefügt - jetzt sollte es gehen.
-
istream_iterator<char> verwirft Whitespaces.
-
Sone schrieb:
Es gibt eine schöne Lösung mit Stream-Iteratoren:
#include <iostream> #include <algorithm> #include <iterator> #include <fstream> int main() { std::ifstream iStream("Beha.esca"); std::ofstream tempStream("Beha.txt"); std::replace_copy( std::istream_iterator<char>(iStream), std::istream_iterator<char>(), std::ostream_iterator<char>(tempStream), '\n', '\t' ); }
(Ungetestet)
most vexing parse
-
Nathan schrieb:
istream_iterator<char> verwirft Whitespaces.
Editiert!
Aber most vexing parse hat doch hiermit nix zu tun...
Edit: Ahh, out hat schon geantwortet.
-
out schrieb:
most vexing parse
Quatsch, was red ich denn, hier gibts ja kein "Problem" damit.
-
Sone schrieb:
Es gibt eine schöne Lösung mit Stream-Iteratoren:
#include <iostream> #include <algorithm> #include <iterator> #include <fstream> int main() { std::ifstream iStream("Beha.esca"); std::ofstream tempStream("Beha.txt"); std::replace_copy( std::istream_iterator<char>(iStream), std::istream_iterator<char>(), std::ostream_iterator<char>(tempStream), '\n', '\t' ); }
(Ungetestet)
Gehts noch langsamer? Da muss ein istreambuf_iterator her.
-
die schrieb:
Sone schrieb:
Es gibt eine schöne Lösung mit Stream-Iteratoren:
#include <iostream> #include <algorithm> #include <iterator> #include <fstream> int main() { std::ifstream iStream("Beha.esca"); std::ofstream tempStream("Beha.txt"); std::replace_copy( std::istream_iterator<char>(iStream), std::istream_iterator<char>(), std::ostream_iterator<char>(tempStream), '\n', '\t' ); }
(Ungetestet)
Gehts noch langsamer? Da muss ein istreambuf_iterator her.
Das war auch nur die grundlegende Idee.
Natürlich geht auch mit Streambuffer-Iteratoren:std::replace_copy( std::istreambuf_iterator<char>(iStream), std::istreambuf_iterator<char>(), std::ostreambuf_iterator<char>(tempStream), '\n', '\t' );
-
Sone schrieb:
std::istreambuf_iterator<char>(iStream >> std::noskipws)
Nein, du hast istreambuf_iteratoren noch nicht verstanden.
-
die schrieb:
Sone schrieb:
std::istreambuf_iterator<char>(iStream >> std::noskipws)
Nein, du hast istreambuf_iteratoren noch nicht verstanden.
Wieso? Funktionieren tut es doch. Mit C++11 natürlich. Habs getestet, der Output ist richtig. Meinst du dass ich sie nicht richtig verwende?
-
Sone schrieb:
Meinst du dass ich sie nicht richtig verwende?
Jo.
istream_iterator ist formatiert: Vor jedem char ein sentry erstellen, laaahm.
istreambuf_iterator gibt dir die Rohdaten.std::noskipws ist nur für den istream_iterator notwendig, das für einen istreambuf zu verwenden zeugt von Unkenntnis.
-
Edit: Hast Recht.
-
Ufz, danke für die vielen Infos die muß ich erst mal verdauen.
Oder ich starte wieder bei "Hello World"
Axel
-
axel99 schrieb:
Ufz, danke für die vielen Infos die muß ich erst mal verdauen.
Nö, musste nicht.
Aber es kann nicht schaden, dir mal Stream-Iteratoren anzugucken (und mir auch nicht
), die sind - wie du sehen kannst - ganz nützlich, weil man dadurch Dateien (bzw. Streams oder Streambufs) mit Iteratoren darstellen und dann an STL-Algos übergeben kann.