![]() |
Array aus TFileStream auslesen?
Hallo,
ich habe ein dynamisches Array, welches ich zur Laufzeit in ein TFileStream speicher:
Delphi-Quellcode:
Beim Neustart des Programms, soll aus diesem TFileStream das Array wieder ausgelesen werden.
FS.Write(Zutaten, sizeOF(Zutaten));
Delphi-Quellcode:
FS.Read(Zutaten, sizeOF(Zutaten));
Leider funktioniert das nicht. Ich bekomme keine Fehlermeldung, jedoch ist das Array nach dem auslesen aus der Datei leer. Was habe ich falsch gemacht? Geht das überhaupt so? Vielen Dank! |
Re: Array aus TFileStream auslesen?
Das SizeOf beim Laden wird dir eine andere Größe liefern als beim Speichern. Speichere die Größe mit ab
|
Re: Array aus TFileStream auslesen?
Hi mo_greene,
Zitat:
Vergiss nicht die Größe des Arrays auch in der Datei abzuspeichern damit du nachher weißt wie viel du einlesen kannst ;) Gruß Neutral General |
Re: Array aus TFileStream auslesen?
Super vielen Dank für die Antwort.
Kann ich die Daten aus meinem Array in die gleiche Datei speichern, in die auch meine anderen Daten aus div. Variablen gespeichert werden? |
Re: Array aus TFileStream auslesen?
Warum nicht?
|
Re: Array aus TFileStream auslesen?
Ok super.
Zitat:
Danke :) |
Re: Array aus TFileStream auslesen?
Delphi-Quellcode:
FS.Write ( Length( Zutaten);
for i := 0 to Length( Zutaten) do begin FS.Write( Zutaten[i], SizeOf( TZutaten)); end; |
Re: Array aus TFileStream auslesen?
Hi,
Naja du weißt doch wie man auf einzelne Elemente des Arrays zugreift. In einer Schleife geht das so:
Delphi-Quellcode:
Die größe des Arrays erhälst du mit
for i:= 0 to High(Array) do
// Etwas mit Array[i] tun
Delphi-Quellcode:
@mkinzler: Sagmal hast du so ne Taste auf der Tastatur die automatisch richtig auf alle aktuellen Threads in der DP antwortet ? :roll:
Length(Array);
Ha! Von wegen richtig. Hast ne Klammer vergessen und es muss von 0 bis High(Array) gehn und nicht bis Length(Array) :P :mrgreen: Gruß Neutral General |
Re: Array aus TFileStream auslesen?
Ok die Klammer hab ich verschlammpt.
Aber bei dynamischen Arrays (welchen immer bei 0 beginnen) sollte High(), das selbe wie Length() ergeben. |
Re: Array aus TFileStream auslesen?
Probiers aus ;)
|
Re: Array aus TFileStream auslesen?
Müsste Length nicht um 1 größer sein als High?
|
Re: Array aus TFileStream auslesen?
Stimmt, das hab ich auch verschlammpert :oops:
|
Re: Array aus TFileStream auslesen?
Wäre es dann so richtig?
Delphi-Quellcode:
Vielen Dank nochmal :)
for i := 0 to High(Zutaten) do
begin FS.Write(Zutaten[i], sizeOF(Zutaten)); end; |
Re: Array aus TFileStream auslesen?
Nein, das muss SizeOf(Zutaten[i]) oder SizeOf(Basistyp) sein.
|
Re: Array aus TFileStream auslesen?
Also folglich:
Delphi-Quellcode:
Danke :)
for i := 0 to High(Zutaten) do
begin FS.Write(Zutaten[i], sizeOF(Zutaten[i])); end; |
Re: Array aus TFileStream auslesen?
Leider erhalte ich mit folgender Syntax:
Delphi-Quellcode:
folgedes in der .dat Datei:
for i := 0 to High(Zutaten) do
begin FS.Write(Zutaten, sizeOF(Zutaten[i])); end; ¨L¸¨L¸¨L¸¨L¸¨L¸¨L¸¨L¸¨L¸¨L¸¨L Dies soll den Inhalt in dem Array darstellen. Das kann doch nicht richtig sein, oder wird das so abgespeichert? |
Re: Array aus TFileStream auslesen?
Zeig mal die Definition von dem Zutaten-Record.
Es muss ein packed record sein und es dürfen keine Strings enthalten sein, höchstens Shortstrings! |
Re: Array aus TFileStream auslesen?
Was steht den in Zutaten drin/wie ist der Typ deklariert?
|
Re: Array aus TFileStream auslesen?
Hi,
du musst schon das entsprechende Element speichern.
Delphi-Quellcode:
Oder gleich so:
for i := Low(Zutaten) to High(Zutaten) do
begin FS.Write(Zutaten[i], sizeOF(Zutaten[i])); //das [i] fehlte! end;
Delphi-Quellcode:
Dann werden alle Elemente in einem Rutsch gespeichert.
FS.Write(Zutaten[Low(Zutaten)], Length(Zutaten) * SizeOf(Zutaten[Low(Zutaten)]));
Mfg FAlter |
Re: Array aus TFileStream auslesen?
Wenn der Basistyp allerdings eine unhandliche Größe hat, wird zu viel gespeichert - dennoch ist FAlters Lösung zu bevorzugen.
|
Re: Array aus TFileStream auslesen?
Zitat:
Zu "Zutaten":
Delphi-Quellcode:
Zutaten : array of string;
Delphi-Quellcode:
SetLength(Zutaten,10); // dies wird leider - aufgrund der Komplexität des Programms - mehrmals aufgerufen, ist aber nicht schlimmm oder?
Delphi-Quellcode:
for i := 0 to ZusammensetzungLb.Count - 1 do
begin cock.SetZutaten(ZusammensetzungLb.Items[i],i); end; //Hier werden Strings aus einer Listbox übergeben. Dieser Inhalt soll letzendlich gespeichert werden.
Delphi-Quellcode:
Speicherung des Inhalts:
procedure TCocktail.SetZutaten(n: string; i: Integer);
(* Dient dazu, in das Array zu schreiben *) begin Zutaten[i] := n; end;
Delphi-Quellcode:
Herauskommen tut folgendes in der .dat Datei:
for i := 0 to High(Zutaten) do
begin FS.Write(Zutaten[i], sizeOF(Zutaten[i])); end;
Delphi-Quellcode:
, was natürlich nicht dem Inhalt entspricht!
Í^
Vielen, vielen Dank! Ich hoffe mir kann jemand helfen :oops: :( |
Re: Array aus TFileStream auslesen?
Ersetze
Delphi-Quellcode:
mit
Zutaten : array of string;
Delphi-Quellcode:
oder einer bestimmten Länge.
Zutaten : array of ShortString;
|
Re: Array aus TFileStream auslesen?
Sag doch das es Strings sind.... grml. :wall:
einen String speicherst du so ab:
Delphi-Quellcode:
Auslesen:
l := length(String);
Write(l,SizeOf(Integer)); Write(String[1],l);
Delphi-Quellcode:
das musst du jetzt eben auf dein Array übertragen
Read(l,SizeOf(Integer));
SetLength(String,l); Read(String[1],l); Gruß Neutral General |
Re: Array aus TFileStream auslesen?
Was willst Du mit
Zitat:
|
Re: Array aus TFileStream auslesen?
|
Re: Array aus TFileStream auslesen?
Huch :shock:...ich habe string mit shortstring ersetzt (@mkinzler) und aufeinmal gehts :-D
Danke!! Zitat:
|
Re: Array aus TFileStream auslesen?
Zitat:
Zitat:
|
Re: Array aus TFileStream auslesen?
Zitat:
Zitat:
|
Re: Array aus TFileStream auslesen?
Nee, wenn Du eine Größe angibst, gilt diese auch.
|
Re: Array aus TFileStream auslesen?
Und wenn ich keine Angebe?
|
Re: Array aus TFileStream auslesen?
Dann hast du ein dynamisches Array dessen Größe du dynamisch mit SetLength festlegen kannst/musst.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:09 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