find und replace von CR/LF



  • 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.


Anmelden zum Antworten