dateien in vektor speichern



  • std::ifstream rd("data.txt");

    std::copy(std::istreambuf_iterator<char>(rd),std::istreambuf_iterator<char>(),back_inserter(myvec));

    std::cout << rd.rdbuf() << std::endl;[/cpp]

    CStoll schrieb:

    copy(istreambuf_iterator<char>(datei),istreambuf_iterator<char>(),back_inserter(my_vec));
    

    (das hängt den Dateiinhalt hinten an den vector dran, also eventuell vorher den bisherigen Inhalt vernichten)

    danke, aber es gibt nun ein neues problem:

    Ich kann die Datei nicht in der Konsole sehen 😕

    std::ifstream rd("data.txt");
    
    std::copy(std::istreambuf_iterator<char>(rd),std::istreambuf_iterator<char>(),back_inserter(myvec));
    
    std::cout << rd.rdbuf() << std::endl;
    

    so würde es in der konsole ausgegeben:

    std::ifstream rd("data.txt");
    
    // nur wird hier nichts in den Vector kopiert :(
    
    std::cout << rd.rdbuf() << std::endl;
    

    mfg



  • Nach dem Einlesen in den vector steht der Lesezeiger der Datei auf deren Ende - dahinter gibt's nichts mehr, was noch angezeigt werden könnte.

    Lösung a: Du gibst den Inhalt des vector<> aus ( copy(myvec.begin(),myvec.end(),ostream_iterator<char>(cout)); ).
    Lösung b: Du fährst die Datei zurück auf den Anfang, bevor du nochmal versuchst sie auszugeben (seekg()).



  • [quote="CStoll"]
    Lösung b: Du fährst die Datei zurück auf den Anfang, bevor du nochmal versuchst sie auszugeben (**seekg()).[/**quote]

    ?

    Mfg



  • streammmmmmer schrieb:

    CStoll schrieb:

    Lösung b: Du fährst die Datei zurück auf den Anfang, bevor du nochmal versuchst sie auszugeben (seekg()).

    ?

    Mfg

    Wenn du es ganz genau willst: rd.seekg(0); setzt den Lesezeiger der Datei wieder auf Anfang. (ich hatte ja gehofft, daß dir das Stichwort ausreicht, um selber zu suchen ;))

    PS: Das Zitieren üben wir nochmal - ja?



  • CStoll schrieb:

    streammmmmmer schrieb:

    CStoll schrieb:

    Lösung b: Du fährst die Datei zurück auf den Anfang, bevor du nochmal versuchst sie auszugeben (seekg()).

    ?

    Mfg

    Wenn du es ganz genau willst: rd.seekg(0); setzt den Lesezeiger der Datei wieder auf Anfang. (ich hatte ja gehofft, daß dir das Stichwort ausreicht, um selber zu suchen ;))

    hab es leider versucht, schaff es leider aber irgendwie noch immer nicht 😞
    Laut diesem Tutorial hab ich es auch gelesen, nur funktioniert bei mir das ja nicht, so wie ich es mir gedacht hätte:

    std::ifstream rd("data.txt"); 
    std::vector<char> myvec; // Keine Zuweisung, da es sich im privaten Bereich einer Klasse befindet.
    
    std::copy(std::istreambuf_iterator<char>(rd),std::istreambuf_iterator<char>(),back_inserter(myvec)); 
    
    std::cout << rd.rdbuf() << std::endl;
    rd.seekg(0);
    
    error C2039: 'seakg': Ist kein Element von 'std::basic_ifstream<_Elem,_Traits>'
    

    CStoll schrieb:

    PS: Das Zitieren üben wir nochmal - ja?

    Ja 😃
    Sorry, aber in der "Vorschau" hat es richtig ausgeschaut und da war ich wohl zu müde nachzuschauen, ob die Tags stimmen.

    Mfg

    PS: ich hab jetzt bis geschlafen^^



  • Du mußt es auch schon richtig abschreiben (trotz Müdigkeit):

    rd.seekg(0);
    

    s. deine Fehlermeldung...



  • danke für eure Hilfe, alles hat geklappt 😉

    Mfg



  • Was ist der Unterschied zwischen istream_iterator und istreambuf_iterator?



  • Michael E. schrieb:

    Was ist der Unterschied zwischen istream_iterator und istreambuf_iterator?

    Hallo Michael,

    der Unterschied ist der, dass man mit istreambuf_iterator nur Zeichen aus dem - dem istream unterlagerten - Streambuf liest und mit istream_iterator werden Typen aus einem istream inklusive der Formatierung und Interpretation gelesen.

    Beispiel:

    #include <algorithm>    // copy
    #include <iostream>
    #include <iterator>     // *_iterator
    #include <sstream>      // istringstream
    #include <string>
    
    int main()
    {
        using namespace std;
        string buf("\t3.9 -2.0\n1.1E+2");
        {
            // --   alle Zeichen
            istringstream input( buf );
            copy( istreambuf_iterator< char >( input ), istreambuf_iterator< char >(), 
                ostream_iterator< char >( cout << "1: [", "|" ) );
            cout << "]\n" << endl;
        }
        {
            // --   alle Zeichen, ohne Whitespace
            istringstream input( buf );
            copy( istream_iterator< char >( input ), istream_iterator< char >(), 
                ostream_iterator< char >( cout << "2: [", "|" ) );
            cout << "]\n" << endl;
        }
        {
            // --   Zahlen
            istringstream input( buf );
            copy( istream_iterator< double >( input ), istream_iterator< double >(), 
                ostream_iterator< double >( cout << "3: [", "|" ) );
            cout << "]\n" << endl;
        }
        return 0;
    }
    

    Die Ausgabe ist:

    1: [    |3|.|9| |-|2|.|0|
    |1|.|1|E|+|2|]
    
    2: [3|.|9|-|2|.|0|1|.|1|E|+|2|]
    
    3: [3.9|-2|110|]
    

    Im ersten Fall wird Zeichen für Zeichen gelesen; im zweiten nur jedes 'lesbare' Zeichen - also formatiert - und im dritten Fall werden die Zahlen auch als solche interpretiert. Das formatierte Lesen und interpretieren ist nur mit dem istream(_iterator) möglich, während der istreambuf(_iterator) nur die 'nackten' Zeichen liest.

    Gruß
    Werner



  • Danke für die gute Erklärung 👍


Anmelden zum Antworten