Struktur mit Vector richtig abspeichern und laden?



  • Hi,

    ich habe eine Struktur in der ein Vector ist, ein iterator und ein char. Der Vector in der struktur bekommt 3 einträge und der char bekommt nen string, soweit so gut! Nun will ich die ganze struktur abspeichern und später wieder laden können! Ich hab mal das probiert:

    class CTile
    {
    public:
        CTile (void);
    
        void setRow         (int row)   { this->m_row = row; }
        void setCol         (int col)   { this->m_col = col; }
        void setFrameIndex  (int value) { this->m_frameIndex = value; }  
    
        int  getRow         (void)      { return (this->m_row); }
        int  getCol         (void)      { return (this->m_col); }
        int  getFrameIndex  (void)      { return (this->m_frameIndex); }
    
    private:
        int     m_row;
        int     m_col;
        int     m_frameIndex;
    
    };
    
    class CMap
    {
    public:
        std::vector<CTile>                vec_Tiles;
        std::vector<CTile>::iterator  vec_Tiles_it;
        char                            *MapName;
    };
    
    std::fstream File("test.map", std::ios::out|std::ios::binary);
    
    int main (void)
    {
        CMap tempMap;
    
        tempMap.MapName = "Testmap";
    
        CTile tempTile;
    
        tempTile.setX(0);
        tempTile.setY(0);
        tempTile.setFrameIndex(0);
    
        tempMap.vec_Tiles.push_back (tempTile);
    
        // ####
        tempTile.setX(64);
        tempTile.setY(0);
        tempTile.setFrameIndex(0);
    
        tempMap.vec_Tiles.push_back (tempTile);
    
        // ####
        tempTile.setX(32);
        tempTile.setY(16);
        tempTile.setFrameIndex(1);
    
        tempMap.vec_Tiles.push_back (tempTile);
    
        File.write((const char*)&tempMap, sizeof(tempMap));
    
        return 0;
    }
    

    nun jetzt weis ich net ob das richtig abgespeichert ist und der vector nicht seine ganzen einträge verloren hat. Und wie lade ich dann die datei wieder richtig? Also ich komm net klar 😞

    Schon mal danke im voraus!

    mfg



  • *push* :(:(



  • am besten ist es du schreibst dir selber eine methode
    zum abspeichern.
    also einfach eine methode in die klasse CTitle zum speichern
    und eine methode in die Klasse CMap.

    eine noch bessere variante ist es wenn du denn "<<" operator ueberlaedtst.
    such mal in den faqs danach.

    mit read und write wird das so nicht klappen, wie du es in er main
    funktion angegeben hast. sie schreiben ja nur den zusammenhaengenden
    block des objekts. enthaelt das objekt aber dynamisch erzeugte objekte
    so werden diese nicht mit abgespeichert (nur die adressen davon).
    in deinem fall z.b. der char-pointer und der vector (alle objekte die
    du in den vector einfuegst werden dynamisch allokiert).



  • danke jetzt hab ich etwas Theorie aber keine Praxis und ich weis nicht wie oder was ich nun tun soll 😞



  • class CTile
    {
    public:
        // ...
        void speichern( ostream& out );
    
    };
    
    class CMap
    {
    public:
        // ...
        void speichern( ostream& out );
    };
    
    void CTitle::speichern( ostream& out )
    {
      // nimm irgendein trennzeichen z.b. " "
      // d
      out << m_row << " " << m_col << " " << m_frameIndex << endl;
    }
    
    void CMap::speichere( ostream& out )
    {
      // durchlaufe alle elemente des vectors
      // rufe fuer jedes element e.speichere( out ) auf
    }
    


  • Hi,

    aso geht das. Wie lade ich das dann? ich mein hier das mit den ganzen kram wieder reinstopfen.



  • void CTitle::lade(istream & in)
    {
      in >> m_row >> m_col >> m_frameIndex;
    }
    

    so in etwa


Anmelden zum Antworten