Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Dynamisches Objekt in Datei schreiben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.07.2006, 17:30 Uhr
mase



Hallo!
Ich habe mir ein dynamisches Objekt "MusicList" von der Klasse "ProjectList" erstellt.
Dieses Objekt würde ich nun gern in ein Binaryfile schreiben.

C++:
    ProjectFile.open(FileName.c_str(),ios_base::out | ios_base::binary);
    ProjectFile.write((char*)MusicList,sizeof *MusicList);


So hatte ich mir das gedacht, ergibt aber einen Segfault.
Die Funktion erwartet einen Zeiger auf ein Zeichen und die Anzahl der Zeichen.


C++:
    ProjectFile.open(FileName.c_str(),ios_base::out | ios_base::binary);
    ProjectFile.write((char*)&MusicList,sizeof MusicList);


Das wäre die Syntax eines statischen Objekts.
Deshalb hab ich mir gedacht, die Funktion käme mit der Adresse, die in der Zeiger-
variablen "MusicList" steht aus. Die Anzahl der Zeichen wäre dann durch "sizeof" und
die Dereferenzierung von "MusicList" zu ermitteln.
Aber so funktioniert das nicht. Scheint ein Typenproblem zu sein.
Kann mir jemand auf die Sprünge helfen?
Kann ich in diese Datei noch ein zweites Objekt desselben Typs schreiben und dann
vielleicht noch den ein oder anderen statischen Typ?

EDIT: Tags repariert
--
May the force be with us!

Dieser Post wurde am 13.07.2006 um 17:33 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.07.2006, 17:40 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Wenn du sizeof auf einen Pointer anwendest, bekommst du immer den Wert 4 egal,wie groß der Inhalt ist, da ja nur die Speicheradresse in der Variablen steht.

C++:
#include <iostream>
using namespace std;

int main(int argc, const char* argv[])
{
        const char* foo = "Lalalalalala";
        cout << sizeof(foo) << endl;
        return 0;
}

Output: 4
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.07.2006, 18:45 Uhr
mase



Deshalb wollte ich ja mit sizeof *MusicList dereferenzieren. Dann müsste doch die
Grösse des Inhalts kommen.
Da MusicList ja schon ein Pointer ist, muss *MusicList ja auf das Objekt verweisen.
--
May the force be with us!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.07.2006, 09:52 Uhr
ao

(Operator)


Das Konzept (Objekte speichern sich und laden sich wieder) heißt Serialisierung.

Übliches Vorgehen:
Stream-Operatoren (::operator<< und ::operator>>) für den gewünschten Typ überladen und in der Überladung das Wegspeichern und Zurücklesen ausprogrammieren.

Beispiel: www.math.uni-wuppertal.de/~axel/skripte/oop/oop14_6.html

Andere Beispiele über Google.

ao

Dieser Post wurde am 14.07.2006 um 09:53 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.07.2006, 15:14 Uhr
mase



Die von mir genannte Methode hab ich aus dem Buch "C++ in 21 Tagen".
Nur da ist in dem Beispiel das Objekt als Wert und nicht, wie bei mir, als Zeiger.
--
May the force be with us!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.07.2006, 15:03 Uhr
mase



Meine Klasse enthält jetzt 2 STL-Listen.
Kann ich solch eine Klasse überhaupt in ein File schreiben?
--
May the force be with us!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.07.2006, 23:55 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Versuch es doch einfach mal - aber genau genommen schreibst du Objekte in ein File, keine Klassen. Es spricht aber rein gar nichts dagegen, wieso das nicht gehen soll. Serialisierung (sollte) immer funktionieren !
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.07.2006, 08:29 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


btw, doppelpost

guckst du hier: www.fun-soft.de/showtopic.php?threadid=15809
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: