Alternative zu fwrite in C++

spiderflo

Mitglied
Servus alle zusammen!
Mal wieder so eine Frage.
Ich kann mir nicht vorstellen, dass sie noch nie gestellt wurde, aber ich konnte nichts finden.
Tut leid, aber ich bin momentan echt schon deprimiert.

Wie veranstalte ich eine binäre Aus- oder Eingabe in eine Datei, wenn es sich nicht um einen char * handelt.
In C schreibe ich zum Beispiel einfach
fread (&Ziel, SoViel 1, Handle)


und habe "SoViel" in "Ziel" von "Handle" gespeichert.
So .. und wie jetzt in C++?
Textbasiert kenn ich mich aus, aber ich verwende Klassen und dynamische Objekte.
Ich weiß die Größe der Klasse (Inhalt ist eine andere Klasse und ein char * mit new-Objekten)

Mit ifstream kann ich binär mit ifstream.read () ja nur char * einlesen.
Kann ich nicht einfach die Adresse der Klasse mit der Größe angeben?

Danke auf jeden Fall.
Hoffe ihr könnt mir bald helfen.
Schöne Grüße aus Wien
Florian
 
Hallo,

dein Stichwort is wahrscheinlich Serialisierung.
Die Methoden read und write von ifstream bzw ofstream kannst du getrost hernehmen..
Hier vielleicht mal ein Bsp.:

Code:
#include <iostream>
#include <fstream>

using namespace std;

class foo{
        private:
                char* word;
                int a;
                int b;
        public:
                foo(char* word, int a, int b) : word(word), a(a), b(b){}

                friend ostream& operator<<(ostream& cout, const foo& f){
                        cout << "word: " << f.word << " a: " << f.a << " b: " << f.b;
                        return cout;
                }

                friend ofstream& operator<<(ofstream& of, foo& f){
                        of.write(reinterpret_cast<char*>(&f), sizeof(f));
                        return of;
                }

                friend ifstream& operator>>(ifstream& inf, foo& f){
                        inf.read(reinterpret_cast<char*>(&f), sizeof(f));
                        return inf;
                }
};

int main(){
        ofstream of("serialize.dat", ios_base::binary);
        foo f("test serialization", 10, 100);
        cout << f << endl;      //print object values
        cout << "------------------------" << endl;
        of << f;        //serialize object f
        of.close();
        f = foo("changed values", 2, 32);
        cout << f << endl;      //print object values
        cout << "------------------------" << endl;
        ifstream inf("serialize.dat", ios_base::binary);
        inf >> f;       //deserialize object values
        cout << f << endl;      //print object values
        inf.close();
}

Gruß

RedWing
 
Zuletzt bearbeitet:
P.S.

Siehe:
Summary
...
During the deserialization process, retrieve the previously-stored values. string objects, arrays and handles are a bit trickier: always dereference them and store the values they point. Remember to store the size of a string or an array in a separate field.

Siehe
http://www.informit.com/guides/content.asp?g=cplusplus&seqNum=129&rl=1

Also mit Pointern immer etwas vorsichtig sein. Erst dereferenzieren und dann speichern.
Was bei meinem Bsp etwas auf der Strecke geblieben ist...
Also musst du wohl alle Referenzen in deinem Objekt manuell selber dereferenzieren
und extra abspeichern...

Gruß

RedWing
 
Zurück