speichern von Ojekten?
-
Hallo forum,
ich schreibe aus indien, wo ich eine software zur erstellung von Stundenplaenen fuer ein Slumschule programmiere.
Dazu moechte ich objekte von der klasse Teacher in einer verketteten liste verwalten und die einzelnen ojekte binaer abspeichern.
Beispiel fuer die klasse Teacher:
class Teacher { char* name Teacher* next }Dann habe ich, um das schreiben und lesen auszuprobieren, zwei funktionen formuliert:
Schreiben() { char* pszFileName = "c:\\test\\myfile.dat"; CFile myFile; CFileException fileException; if ( !myFile.Open( pszFileName, CFile::modeCreate | CFile::modeReadWrite ), &fileException ) { TRACE( "Can't open file %s, error = %u\n", pszFileName, fileException.m_cause ); } Teacher* teach= new Teacher teach->name="test"; myFile.Write( &teach, sizeof( class Teacher ) ); myFile.Close(); }Naechste funktion zum lesen der daten:
Lesen() { char* pszFileName = "c:\\test\\myfile.dat"; CFile myFile; CFileException fileException; UINT nActual = 0; Teacher* temp; if ( !myFile.Open( pszFileName, CFile::modeReadWrite ), &fileException ) { TRACE( "Can't open file %s, error = %u\n", pszFileName, fileException.m_cause ); } myFile.SeekToBeginn(); nActual = myFile.Read( &temp, sizeof( class Teacher ) ); AfxMessageBox("test"); myFile.Close(); }Wenn ich das programm starte und einen Teacher einlese, und danach, aber waehrend der selben laufzeit die funktion Lesen() aufrufe, wird die AfxMessageBox("test") angezeigt.
Schliese ich die anwendung, starte sie neu und rufe die lesen funktion auf zeigt die AfxMessageBox nichts mehr an; Als waere der name nur noch "".
Die myFile.dat, ist aber immernoch beschrieben.
Ich habe das selbe vorher mit fopen, fread, fwrite usw. versucht. Gab den selben fehler.weis jemand woran das liegen koennnte, ich schmohre naehmlich aschon seit tagen auf diesem problem?
-
Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
1. bitte verwendete Code-Tags
2. name ist als "char*" definiert, d.h. als Pointer auf char. Wenn du das also in eine Datei schreibst, dann landet in der Datei nix anderes als..... ein char*, d.h. eine Speicheradresse. An dieser Speicheradresse liegt waehrend du das Programm zum speichern ausfuehrst der gewuenschte String. Wenn du das Programm aber neu startest muss der String nicht wieder an der gleichen Speicheradresse liegen, und dein name-Pointer zeigt ins Nirvana. Das Programm koennte genauso gut abstuerzten oder dir Datenmuell anzeigen.
Tipps:
1. verwende <fstream> statt MFC-Funktionen fuer Dateioperationen (portabler): dann waere der char* richtig in der Datei gelandet, weil die fstreams fuer char* ueberladen wurden, damit genau so etwas nicht passiert.
2. verwendte std::string statt char*, dann hast du solche Probleme ueberhaupt nicht mehr.
-
Kannst du mir sagen wo ich eine Anleitung zur Handhabung von fstream finde oder mir ein Beispiel dafuer schreiben, wie man objekte von der klasse Teacher
in eine Datei schreibt und ausliest?class Teacher { public: char getname(); void setname(char nam[30]); // oder halt doch char* wenn es ueberladen wird void setnext( Teacher* nex); char name[30]; // oder halt doch char* wenn es ueberladen wird Teacher* next; BOOL a, b, c; };danke
<edit>Bitte Code-Tags verwenden!</edit>
alex
-
Unter http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrf_fstream_header.asp findest du die Beschreibung zur C++ Standard Library. Darunter ist auch fstream zu finden. Aber Achtung : fstream beerbt Klassen wie basic_ios und ios_base. Du findest also Members für fstream-Klassen auch dort.