[gelöst] [boost] [i/oarchive] Speichern und Laden einer Klasse durch sich selber(?)



  • Hallo,

    ich möchte gerne eine klasse mit einem string, und einem char array in eine Datei speichern. Nach möglichkeit nicht so, das jeder hans wurst sie lesen kann, und den inhalt interpretieren kann.

    Nach einigen fehlversuchen mit ausgelagerten save funktionen, die an der zeiger übergabe der klasse lagen (denke ich?) hatte ich mich entschieden in der klasse eine funktion zu schreiben, die den inhalt selber speichert.

    Das Speichern klappt auch, aber beim Laden bekomm ich leider immer eine Fehlermeldung mit der ich nicht wirklich viel anfangen kann...

    vllt. hat jemand von euch ja eine idee..

    Klasse:

    class cMatrix {
    public:
    	string decpass;
    	char PWMatrix[16][19];
    	void save() const
    {
    	std::ofstream file("archiv.txt"); 
        boost::archive::binary_oarchive oa(file); 
    	oa << this;
    }
    		void load() const
    {
      std::ifstream file("archiv.txt"); 
      boost::archive::binary_iarchive ia(file); 
    	ia >> this;
    }
    private: 
      friend class boost::serialization::access;
      template <typename Archive> 
      void serialize(Archive &ar, const unsigned int version) 
      { 
        ar & decpass; 
    	//ar & PWMatrix;
      } 
    
    };
    

    Laden / Speichern:

    int _tmain(int argc, _TCHAR* argv[])
    {
            cMatrix habt;
            //habt.save();
    	habt.load();
    }
    

    Die Fehlermeldungen sind folgende:

    boost/archive/detail/check.hpp(162): error C2338: typex::value
    boost/archive/detail/iserializer.hpp(522): error C3892: "t": Einer Variablen, die konstant ist, kann nichts zugeordnet werden.
    

    Ich hoffe jemand von euch kann mir sagen, wo genau mein Problem liegt ^^

    Kubax

    P.s. meine Programmierkenntnisse sind was c / c++ angeht leider nicht die besten, ich habe vor einiger zeit hobby mäßig viel mit vb & basic gespielt...


  • Mod

    Die Fehlermeldung ist doch mehr als leicht verständlich: Deine Ladefunktion ist als const deklariert, will aber this ändern.



  • hmm.. ok, das würde einleuchten..

    leider reicht es offenbar nicht das const zu entfernen... die Fehlermeldung bleibt die gleiche oO

    Edith sagt:
    Danke auf jedenfall schonmal für die blitzschnelle reaktion!!! 🙂


  • Mod

    kubax schrieb:

    hmm.. ok, das würde einleuchten..

    leider reicht es offenbar nicht das const zu entfernen... die Fehlermeldung bleibt die gleiche oO

    Edith sagt:
    Danke auf jedenfall schonmal für die blitzschnelle reaktion!!! 🙂

    Oh, und this ist auch immer ein konstanter Zeiger, dem darfst du natürlich auch nichts zuweisen. Hatte gar nicht gesehen, dass du den Pointer nicht dereferenzierst. Bist du sicher, dass dies überhaupt das ist was du willst?



  • Ok, Dereferenzieren... gidf.de ^^

    Also nach dem was ich gefunden hab wäre das dann so(?)

    class cMatrix {
    public:
        string decpass;
        char PWMatrix[16][19];
        void save() const
    {
        std::ofstream file("archiv.txt");
        boost::archive::binary_oarchive oa(file);
        oa << this;
    }
            void load()
    {
      std::ifstream file("archiv.txt");
      boost::archive::binary_iarchive ia(file);
        ia >> *(this); // das sollte eigentlich Fett hier stehen, aber der [B] wird im CPP tag leider nicht richtig formatiert ^^
    }
    private:
      friend class boost::serialization::access;
      template <typename Archive>
      void serialize(Archive &ar, const unsigned int version)
      {
        ar & decpass;
        //ar & PWMatrix;
      }
    
    };
    

    oder hab ich mich da jetzt falsch informiert? ^^

    Werd das morgen auf der Arbeit mal durch probieren.. ist ein Projekt das ich nebenbei auf der Arbeit erstelle, um ein Passwörter Decodieren nicht immer die hässliche EXCEL Vorlage bemühen zu müssen ^^


  • Mod

    Das ist technisch das was man mit Dereferenzieren meint, aber bist du auch sicher, dass dies das ist was du machen willst? Der ganze Code den du hier zeigst kommt mir jedenfalls sehr ungewöhnlich vor, auch wenn er nun syntaktisch richtig ist. Du musst aber von jedem einzelnen Zeichen in deinem Code ganz genau verstehen was es macht und einen Plan haben wozu es gut sein soll. Die reine Korrektur der Syntax die du jetzt vorgenommen hat, heißt noch nicht, dass dein Programm auch das tut was du willst.



  • ob das jetzt genau das ist, was ich will werde ich wohl morgen sehen ^^

    Das die Zusammenstellung vom Code etwas ungewöhnlich ist, kann sein, weil ich mir vieles halt versucht hab selber zu erlesen..

    Geplant ist es halt den Inhalt der Password Matrix inklusive des Dekodierpasswort in eine Datei zu schreiben, damit ich später die Datei wieder einlesen kann.

    Ich hab bereits eine lauffähige Version, die nur einen Array in eine reine Textdatei schreibt, die jemand, der weiß wie das dekodieren geht, benutzen kann, um sich einen Dekodiernamen anhand des Dekodierpassworts selber entschlüsseln kann..

    recht theoretisch, aber ich hoffe verständlich ^^

    Anmerkung:
    Ich bin zwar Fachinformatiker, aber halt Systemintegration... das heißt ich weiß in etwa wie es funktioniert, und ich Programmiere auch gerne, aber halt nicht besonders sauber 😉



  • Ok, wie du es schon prophezeit hast, ist es jetzt von der Syntax korrekt, funktioniert aber leider nicht.

    Ich bekomm nach dem ausführen von load() eine Exception...

    "Unbehandelte Ausnahme bei 0x755cb727 in test.exe: Microsoft C++-Ausnahme: boost::archive::archive_exception an Speicherposition 0x0040ef5c.."

    hat jemand von euch eine Idee, oder sogar angepassten Code, wie ich eine klasse mit einer Funktion innerhalb der klasse binär in eine Datei schreiben und lesen kann?



  • Auch auf die Gefahr hin als Spammer bezeichnet zu werden.. ich hab mein Problem behoben.. denke ich zumindest ^^

    class cMatrix {
    public:
        string decpass;
    
        char PWMatrix[16][19];
    	        void load(cMatrix *ar)
    {
      std::ifstream file("archiv.txt");
      boost::archive::binary_iarchive ia(file);
        ia >> *ar;
    }
    		    void save(cMatrix ar)
    {
    
        std::ofstream file("archiv.txt");
        boost::archive::binary_oarchive oa(file);
        oa << ar;
    }
    private:
      friend class boost::serialization::access;
      template <typename Archive>
      void serialize(Archive &ar, const unsigned int version)
      {
        ar & decpass;
        ar & PWMatrix;
      }
    
    };
    

    Komisch finde ich jedoch, das ich beim Speichern keinen pointer brauch, beim laden allerdings schon.... naja, Hauptsache es funktioniert...

    Danke für den Tipp mit dem dereferenzieren... ich hatte die Funktionen extern schon mal probiert, hatte da aber genau das Problem mit dem pointer..

    Danke jedenfalls. ich setze den thread dann mal als gelöst 🙂



  • kubax schrieb:

    ...
    Komisch finde ich jedoch, das ich beim Speichern keinen pointer brauch, beim laden allerdings schon....

    Naja - das ist nicht ganz so überraschend. Wenn ein neues Objekt erzeugt werden soll (via load()), muss man hinterher auch wissen, wo man es findet. Sonst kann man mit dem Objekt nichts mehr machen.

    Mir schiene es übriegns eine gute Idee load() entweder zu einer static oder gar zu einer "freien" Funktion zu machen. Non-static-memberfunktionen suggerieren immer "hier mache ich etwas mit einem bestehenden Objekt" - und das ist hier nicht der Fall.
    Du hast sogar das Problem, dass du erst ein Objekt selbst erzeugen musst, um ein(ander)es zu laden.

    Gruß,

    Simon2.


Anmelden zum Antworten