struct in datei speichern
-
Hallo!
also sagen wir ich habe ein solches struct:
struct Auto { Integer Nummer; String Marke; String Typ; Integer PS; }; Auto s_auto; s_auto.Nummer = 1; s_auto.Marke = "BMW"; s_auto.Typ = "7er"; s_auto.PS = 360;
wie kann ich nun diesen struct (sagt man so?) in der Datei autos.dat speichern ?
und brauch ich das Datenfeld "Nummer" ? oder wird automatisch beim anlegen einer structdatei ein index erstellt ?danke im voraus
Johannes
-
mit String ist das nicht so einfach.
besser:
struct Auto { Integer Nummer; char Marke[100]; char Typ [100]; Integer PS; };
dann kannste sowas machen:
TFileStream* stream=new TFileStream("C:\\test.dat",fmCreate); Auto car; car.Nummber=122; strcpy(car.Marke,"Audi"); strcpy(car.Typ,"Kombi"); car.PS=180; stream->Write((void*)&car,sizeof(car)); delete Stream;
auslesen kannste dann:
Auto car; TFileStream* stream=new TFileStream(("C:\\test.dat",,fmOpenRead); stream->Read((void*)&car,sizeof(car)); // mach was mit car delete stream;
-
oder du bastelst dir noch 2 zusaetzliche funktionen, die dir aus den daten deines structs einen stream macht, bzw umgekehrt. dann kannst auch mit variablen variabler-groesse arbeiten.
Meep Meep
-
Oder Du guckst mal auf meiner Seite ...
-
hmm, danke für die antworten...aber geht das so nicht?
using namespace std; struct Auto { String Marke; String Typ; Integer PS; }; Auto s_auto; ofstream out("Autos.dat"); s_auto.Marke = "Marke"; s_auto.Typ = "Typ"; s_auto.PS = 360; if (out.is_open()) { out.write((const char*)&s_auto, sizeof(s_auto)); }
Edit:
Bitte die Code-Tags benutzen. Danke!
-
@AndreasW
ich habe jetzt mal deinen Code probiert, sieht auch so aus obs funktioniert...
erm...aber...damit ich weiß ob ich den stream mit fmCreate erstelle oder mit fmOpenWrite muss ich ja wissen ob die Datei schon existiert...also hab ich sowas gemachtif (!FileExists("Buttons.dat")) {TFileStream* streamout = new TFileStream("Buttons.dat",fmCreate);} else {TFileStream* streamout = new TFileStream("Buttons.dat",fmOpenWrite);}
aber dann kommt ne Fehlermeldung wie "undefiniertes symbol 'streamout'"...also wie macht man sowas normalerweise ?
danke im voraus
Johannes
-
Na komm, das sind nun aber absolute Grundlagen!
int x; if (true) x = 1; else x = 0;
-
hallo Johannes2002
nein so funktioniert das nicht.
String arbeitet mit pointern, und in deinem fall wuerde er nur die adresse des strings speichern, wo der im speicher liegt.wenn dann mußt du es so machen, wie es AndreasW oben mit den Char´s gezeigt hat. String is aehnlich als wenn du mit char* arbeiten wuerdest. da steht nur die adresse drinnen. deshalb mußt du char verwenden. wenn du unbedingt
String verwenden willst, solltest es villeicht auf meine schon beschriebene art machen. is aber nicht ganz so einfach.Meep Meep
-
Wenn alle Stricke reißen könntest Du auch anstatt ner struct eine class verwenden und darin dann ein Lade- und Speicherfunktionen implementieren die u.U. Element für Elemnt in eine Datei pinselt bzw. ausliest.
-
aha...hmmm
naja, ich hab erst vor ein paar tagen mit c++ angefangen, vorher hab ich ein wenig delphi programmiert...deshalb hab ich noch nicht so den durchblick...ich sollte wohl wirklich erstmal paar bücher durchmachen
ich hab noch das Buch "C programmieren von Anfang an" da, das kann ich ich ja für den Anfang auf jeden fall gebrauchen, oder ? oder wäre es besser gleich mit einem c++ buch anzufangen ?
-
@ peter
warum soll er unbedingt von der dtruct auf die class wechseln ?
methoden und das ganze zeugs kann er ja in structs genauso machen.Meep Meep