![]() |
Mehrdimensionales, dynamisches Array speichern
Hallo Delphi-PRAXIS,
ich möchte mein zweidimensionales dynamsiches Array (mit Record) in einer Datei speichern und wieder laden. Kann mir jemand beschreiben wie das funktioniert? (Die Suche hat mir nicht wirklich wieter geholfen...) FG Dunkelbunt |
AW: Mehrdimensionales, dynamisches Array speichern
Die Array-Dimensionen sollen dabei erhalten bleiben, oder geht es rein um die Daten in den Records?
|
AW: Mehrdimensionales, dynamisches Array speichern
Nein, es ist wichtig, dass die Dimensionen auch erhalten bleiben.
|
AW: Mehrdimensionales, dynamisches Array speichern
Zum Beispiel als CSV-Datei.
Die ersten beiden Felder enthalten die Position im Array; anschliesend folgen die Daten der Struktur. (ich nehme hier ein 2-dimensionales Array an)
Code:
So kann man auch
0, 0, VW, blau, 90
0, 1, Audi, rot, 110 0, 2, Opel, rot, 75 1, 0, .... ![]() Vorteil der CSV-Datei ist die leichte Weiterverarbeitung in externen Tools. |
AW: Mehrdimensionales, dynamisches Array speichern
Hm, okay.
ich weiß nicht ganz wie ich vorgehen soll... EDIT: Ich hab es jetzt so 'versucht':
Delphi-Quellcode:
Ist das korrekt?
procedure Speichern;
var Datei: TextFile; Zeile, Spalte: string; i, n : integer; StringList1 : TStringList; begin Zeile:=''; Spalte := ''; StringList1 := TStringList.Create; Try for i := 0 to Length(Xdimension) do for n := 0 to length(Ydimension) do begin Zeile := ''; Zeile :=myarray[i,n].zeichen+';'+ IntToStr(myarray[i,n].attribut)+';'; StringList1.Add(Zeile); end; StringList1.SaveToFile(ExtractFilePath(Application.ExeName)+'test.CSV'); Finally StringList1.Free; end; end; Wie kann ich das ganze jetzt wieder auslesen? |
AW: Mehrdimensionales, dynamisches Array speichern
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht kannst Du damit was anfangen ...
|
AW: Mehrdimensionales, dynamisches Array speichern
zur Unit uReadWrite_2D_Arrays:
Die mit der Verwendung des Parameters T2DStringArray überladenen Prozeduren Save2DArray() and Load2DArray() enthalten einen äußerst fatalen Fehler: In den Anweisungen dieser beiden Prozeduren writer.Write() bzw. reader.Read() wird das Element [i,x] des Array A (also A[i,x]) ja nicht als String, sondern als Puffer übergeben. Daher muss zwingend als Start des übergebenen Puffers die erste Position des Stringelements A[i,x][1] gesetzt werden (nicht einfach nur A[i,x]). Die beiden betroffenen Prozeduren müssen richtig wie folgt codiert sein:
Code:
procedure Save2DArray(const A: T2DStringArray; S: TStream); overload;
var writer: TWriter; i,x: Integer; begin Assert(Assigned(S)); writer := TWriter.Create(S, 8096); try writer.WriteInteger(Length(A)); for i := 0 to Length(A) - 1 do begin writer.WriteInteger(Length(A[i])); for x := 0 to Length(A[i]) - 1 do begin Writer.WriteInteger(Length(A[i,x])); writer.Write(A[i, x][1], Length(A[i,x])); // <-- ! end; end; { For } finally writer.Free; end; { Finally } end;
Code:
procedure Load2DArray(var A: T2DStringArray; S: TStream); overload;
var reader: TReader; i,x, numrows, numcols,slen: Integer; begin Assert(Assigned(S)); reader := TReader.Create(S, 8096); try numrows := reader.ReadInteger; SetLength(A, numrows); for i := 0 to numrows - 1 do begin numcols := reader.ReadInteger; SetLength(A[i], numcols); for x := 0 to numcols - 1 do begin slen := reader.ReadInteger; SetLength(A[i,x], slen); if slen>0 then reader.Read(A[i, x][1], slen); // <-- ! end; end; { For } finally reader.Free; end; { Finally } end; |
AW: Mehrdimensionales, dynamisches Array speichern
Bei Verwendung von ShortStrings kann man alle Strings einer Ebene zusammenhängens abspeichern/lesen und mü0te somit nur noch die i-Ebene durchlaufen
- kein Unicode (ShortStrings, also String[x] gibt es nur in ANSI) - es wird immer die maximale Zeichenanzahl der Strings gespeichert |
AW: Mehrdimensionales, dynamisches Array speichern
Also ich würde schon bei einer CSV-Datei bleiben.
Binäre Datenformate sind so schwer zu debuggen und können nicht weiterverarbeitet werden. Ich habe mal deine "Speicher"-Prozedur etwas aufgearbeitet. Bei grösserer Datenmenge kann man dann auch auf einen TFileStream umschwenken, um den Speicherverbrauch durch TStringList zu vermeiden.
Delphi-Quellcode:
procedure Speichern(const filename:string);
var Datei: TextFile; Zeile, Spalte: string; i, n : integer; StringList1 : TStringList; begin StringList1 := TStringList.Create; Try for i := 0 to Xdimension-1 do for n := 0 to Ydimension-1 do begin Zeile := Format('%d;%d;', [i,n])+ myarray[i,n].zeichen+';'+ IntToStr(myarray[i,n].attribut); StringList1.Add(Zeile); end; StringList1.SaveToFile(filename); Finally StringList1.Free; end; end; |
AW: Mehrdimensionales, dynamisches Array speichern
Hallo,
Zitat:
Wie genau kann ich denn jetzt die Datei wieder auslesen? Und wie kann ich die Daten nun in mein Array kopieren? Damit wäre mir sehr geholfen. Fg Dunkelbunt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz