struct-Aray speichern (2) - Meine Lösung
-
Hallo,
nachdem ich etliche Anregungen zu diesem Thema in diesem Forum erhalten habe, möchte ich hier einmal meine Lösung vorstellen, denn ich denke, da gibts vielleicht was zu verbessern
Die beispiel Struct ist folgende:
struct Ding { AnsiString Name; int a; void write(AnsiString DatName, int i); void read(AnsiString DatName, int i); } ;Mein Problem waren die Methoden read() und write() für den fall, dass ich von der Struct eine Array anlege, etwa so:
Ding test[5];Folgende Lösung hab ich nun nach intensiver Nutzung der erhaltenen Hinweise und der Hilfefunktionen gefunden:
void Ding::write(AnsiString DatName, int i) { int oFileHandle; if (i==0) oFileHandle = FileCreate(DatName); else oFileHandle = FileOpen(DatName,fmOpenWrite ) ; FileSeek(oFileHandle, 0, 2); //Zeiger ans Ende der datei setzen int strsize = Name.Length(); FileWrite(oFileHandle,(char *) &strsize, sizeof(strsize)) ; FileWrite(oFileHandle, Name.c_str(), strsize +1); FileWrite(oFileHandle, (char *) &a, sizeof(a)); FileClose(oFileHandle); } ; void Ding::read(AnsiString DatName,int i) //gehts auch ohne int i ??? { int iFileHandle; iFileHandle = FileOpen(DatName,fmOpenRead ); int strsize; for (int anz =0; anz <=i; anz++) { FileRead(iFileHandle,(char*) &strsize, sizeof(strsize)); char *tstr= new char[strsize + 1]; FileRead(iFileHandle,tstr, strsize+1); Name = AnsiString(tstr); FileRead(iFileHandle,(char*) &a, sizeof(a)); } FileClose(iFileHandle); } ;Die datei schreiben bzw. lesen geht dann so:
//Schreiben for (int i = 0; i<5; i++) { test[i].write("daten.txt", i) ; } //Lesen for (int i = 0; i<5; i++) { test2[i].read("daten.txt",i) ; ; }
Meine Frage: gehts auch ohne den Übergabeparameter int i, mit welchem ich unterscheide, ob das erste Arrayelement (bei write)geschrieben bzw. welches Arrayelement (bei read) gelesen wird. Im Falle von read ist es so, das er mit jedem neuen Aufruf die datei von Anfang an durchläuft, was bei großen Arrays sehr zeitaufwendig ist.Über Hinweise würde ich mich sehr freuen
Grüße von sehreilig
-
Das bitte in den Originalthread posten.
Faustregel: ein Thema pro Thread, ein Thread pro Thema.