Vektor in Datei schreiben und auslesen.



  • #include <vector>
    #include <iostream>
    #include <iterator>
    #include <fstream>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
        vector<int> myVec;
        myVec.reserve(100);
        // Sinnloses befüllen des Vectors, hauptsache da is was drin
        for(int i = 0;i < 100;++i)
            myVec.push_back(i);
    
        fstream datei("Ausgabe.txt", ios::out);
        if(!datei)
            return 20;
    
        // Speichern
        datei<<myVec.size()<<" "; // Optional
    
        // Das ist das ganze Speichern. Bei Fragen fragen
        copy(myVec.begin(),myVec.end(),ostream_iterator<int>(datei," "));
    
        datei.close(); // Datei schliessen (wollen ja wieder draus lesen)
    
        // Lesen
        datei.open("Ausgabe.txt",ios::in);
        if(!datei)
            return 20;
    
        myVec.clear();     // Vector leer machen, sonst heisst es noch ich les nix das
                        // stand da ja schon :clown:
    
        vector<int>::size_type size; //Optional
        datei>>size; //Optional
        myVec.reserve(size); //Optional
    
        istream_iterator<int> begin(datei); // Anfangsiterator auf die Datei
        istream_iterator<int> end; // Enditerator
        copy(begin,end,back_inserter(myVec)); // Und wieder auslesen.
        // Kontrollausgabe ob das auch geht
        copy(myVec.begin(),myVec.end(),ostream_iterator<int>(cout," "));
        return 0;
    }
    

    Der Code ist ein Beispiel dafür, wie man einen Vektor in eine Datei schreiben und wieder auslesen kann.
    Eine Zeile dabei verstehe ich allerdings nicht, Zeile 37:

    vector<int>::size_type size;
    

    Hätte man da nicht auch

    unsigned int size;
    

    schreiben können?


  • Mod

    Und woher weisst du, dass ein vector<X>::size_type immer und ueberall ein unsigned int ist? An dem Rechner an dem ich gerade sitze gilt das beispielsweise nicht.



  • SeppJ schrieb:

    Und woher weisst du, dass ein vector<X>::size_type immer und ueberall ein unsigned int ist? An dem Rechner an dem ich gerade sitze gilt das beispielsweise nicht.

    Hm, ok, d.h. auch bei

    size_t size;
    

    wäre das der Fall?



  • nein

    vector ist ja teil der standardbibliothek, und die ist so designed, dass man eine einheitliche schnittstelle hat. für alle zielsysteme (windows, mac, deine kaffeemaschine usw.)

    aber die genaue umsetzung, also die implementierung sieht anders aus. die muss ja auf jedes system angepasst werden (klar deine kaffeemaschine wird lang nicht so leistungsfähig sein beim sortieren von vectoren wie dein windwox 7 rechner mit fetten i7 Prozessor und 16gb ram)

    d.h. die benutzung ist für alle systeme gleich, aber das was du nicht siehst, wie alles umgesetzt ist und was für den programmierer verborgen ist, das ist auf das entsprechende zielsystem angepasst und optimiert

    so, und bei deinem 32bit windwos xp rechner ist der günstigste datentyp für indizes halt unsigned int (als beispiel), für deinen dicken workstation server mit 128bit könnte es aber eine ultra long long sein und für eben deine waschmaschine ein unsigned short
    das size_type ist aber nur ein klassen internes typedef, damit man nicht in konflikt mit den intern benutzten gerät. klar du kannst auch uint nehmen, aber das kann dir unter umständen irgendwann mal in loch vor die füße setzen...



  • klar du kannst auch uint nehmen, aber das kann dir unter umständen irgendwann mal in loch vor die füße setzen...

    In diesem Fall sobald er mehr als 2^32 Ints verwaltet, also genau 16GB Daten am Stück hat. Also wohl in den nächsten 10 Jahren nicht. 😉
    Klar ist es unschön nicht den typedef zu nehmen, aber imho ein Punkt an dem man 5 gerade sein lassen kann.


  • Mod

    Und was macht er auf der Kaffeemaschine wo unsigned int 16 Bit hat und der vector::size_type ein unsigned long mit 32 Bit ist?



  • Ethon schrieb:

    klar du kannst auch uint nehmen, aber das kann dir unter umständen irgendwann mal in loch vor die füße setzen...

    In diesem Fall sobald er mehr als 2^32 Ints verwaltet, also genau 16GB Daten am Stück hat. Also wohl in den nächsten 10 Jahren nicht. 😉
    Klar ist es unschön nicht den typedef zu nehmen, aber imho ein Punkt an dem man 5 gerade sein lassen kann.

    Meinste nicht das 2^32 nur 4GB sind 😉 Und die sind schon realistisch.



  • SeppJ schrieb:

    Und was macht er auf der Kaffeemaschine wo unsigned int 16 Bit hat und der vector::size_type ein unsigned long mit 32 Bit ist?

    Die Chance dass sein Programm auf ner Kaffeemaschiene läuft ist noch geringer als 2^³2 Ints am Stück zu haben. 😉
    Und selbst wenn, dann würde ich zuerst cin-Eingaben etc ankreiden.

    Meinste nicht das 2^32 nur 4GB sind 😉 Und die sind schon realistisch.

    2^32 * sizeof(int) 😉



  • Das stimmt wiederum 🙂



  • Ich sehe überall immer nur das jemand nur ein Wert erhöht. Aber was ist zb. wenn ich im Programm gefragt werde ob eine Neue Frage und Antwort dazu kommen soll.
    zb.

    -Menü
    ---Anmeldung
    ---Quiz
    ---Rangliste
    ---Fragen und Antworten hinzufügen

    Ich kann zwar mit push_back auch ein Satz hinzufügen aber dann fehlt der wert damit es in dem Quiz hinten dran gehangen wird.

    Ich



  • @Dpascalm sagte in Vektor in Datei schreiben und auslesen.:

    Ich sehe überall immer nur das jemand nur ein Wert erhöht. Aber was ist zb. wenn ich im Programm gefragt werde ob eine Neue Frage und Antwort dazu kommen soll.
    zb.

    -Menü
    ---Anmeldung
    ---Quiz
    ---Rangliste
    ---Fragen und Antworten hinzufügen

    Ich kann zwar mit push_back auch ein Satz hinzufügen aber dann fehlt der wert damit es in dem Quiz hinten dran gehangen wird.

    Ich

    Was soll dieser wirre Blödsinn in einem Uralrthread?



  • Wieso ein neuen Thread eröffnen?
    In anderen Foren meckern die immer wenn man ein neuen Thread öffnet und hier bekommt man Mecker wenn man es nicht tut.



  • In den Foren die ich kenne gilt das auch, keine Uraltthreads zu verwenden. Bei manchen gib es extra eine Warnung. Und, Dein Beitrag hat nichts mit dem Thread zu tun.



  • @Dpascalm
    Wenn es...

    • einen aktuellen Thread gibt, also sagen wir wo die letzte Antwort nicht mehr als ne Woche oder so alt ist
    • in dem es genau um das Thema geht wozu du etwas fragen willst, nur das eine Detail das du fragen willst wurde da noch nicht besprochen

    ...dann poste die Frage gerne in diesem Thread. Völlig OK.

    Andernfalls mach einen neuen Thread auf.

    Es interessiert niemanden einen viele Monate alten oder wie hier sogar viele Jahre alten Thread nochmal durchzulesen, nur um verstehen zu können worauf du dich überhaupt beziehst.

    Genau so wie der ursprüngliche Fragesteller oft nicht erfreut ist wenn du eine Frage in seinem Thread stellst, die zwar "verwandt" ist, aber mit dem was er wissen möchte nicht direkt was zu tun hat. Dann gibt's nämlich im wesentlichen nur 3 Möglichkeiten was passieren kann:

    1. Deine Frage wird ignoriert
    2. Deine Frage wird aufgegriffen und die ursprüngliche Frage wird ignoriert
    3. Deine Frage wird aufgegriffen und die ursprüngliche Frage wird auch weiter diskutiert, was dann zu einem unübersichtlichen Mischmasch führt wo schnell Misverständnisse entstehen

    Die erste der Möglichkeiten wird dich nicht freuen, und die zwei anderen werden den ursprüngliche Fragesteller nicht freuen.

    Also im Zweifelsfall lieber einen neuen Thread aufmachen. Wenn du meinst ein existierender Thread wäre zu deiner Frage auch irgendwie interessant, kannst du ja einfach einen Link auf diesen Thread in deinem neuen Thread posten - idealerweise gleich einen Link auf den Beitrag wo der für dein Thema interessante Teil los geht.

    Wichtige Ausnahme: du hast einen Thread erstellt und dort Antworten zum Thema bekommen die dir bloss einfach nicht passen bzw. die du nicht verstehst. In so einem Fall einen zweiten Thread aufzumachen wird nicht so gern gesehen.


Anmelden zum Antworten