Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array aus TFileStream auslesen? (https://www.delphipraxis.net/115528-array-aus-tfilestream-auslesen.html)

mo_greene 13. Jun 2008 13:01


Array aus TFileStream auslesen?
 
Hallo,


ich habe ein dynamisches Array, welches ich zur Laufzeit in ein TFileStream speicher:

Delphi-Quellcode:
FS.Write(Zutaten, sizeOF(Zutaten));
Beim Neustart des Programms, soll aus diesem TFileStream das Array wieder ausgelesen werden.

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!

mkinzler 13. Jun 2008 13:04

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

Neutral General 13. Jun 2008 13:05

Re: Array aus TFileStream auslesen?
 
Hi mo_greene,

Zitat:

Zitat von mo_greene
Geht das überhaupt so?

Nein so geht es leider nicht ;) SizeOf(Zutaten) ergibt 4, denn Zutaten selbst ist nur ein Pointer auf die Array-Daten. Du musst dein Array mit einer for-Schleife in die Datei schreiben und auch wieder auslesen.

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

mo_greene 13. Jun 2008 13:07

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?

mkinzler 13. Jun 2008 13:08

Re: Array aus TFileStream auslesen?
 
Warum nicht?

mo_greene 13. Jun 2008 13:09

Re: Array aus TFileStream auslesen?
 
Ok super.

Zitat:

Du musst dein Array mit einer for-Schleife in die Datei schreiben und auch wieder auslesen.

Vergiss nicht die Größe des Arrays auch in der Datei abzuspeichern damit du nachher weißt wie viel du einlesen kannst Wink
Wie mache ich das denn genau?

Danke :)

mkinzler 13. Jun 2008 13:13

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;

Neutral General 13. Jun 2008 13:15

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:
for i:= 0 to High(Array) do
  // Etwas mit Array[i] tun
Die größe des Arrays erhälst du mit

Delphi-Quellcode:
Length(Array);
@mkinzler: Sagmal hast du so ne Taste auf der Tastatur die automatisch richtig auf alle aktuellen Threads in der DP antwortet ? :roll:

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

mkinzler 13. Jun 2008 13:18

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.

Neutral General 13. Jun 2008 13:19

Re: Array aus TFileStream auslesen?
 
Probiers aus ;)

DeddyH 13. Jun 2008 13:19

Re: Array aus TFileStream auslesen?
 
Müsste Length nicht um 1 größer sein als High?

mkinzler 13. Jun 2008 13:20

Re: Array aus TFileStream auslesen?
 
Stimmt, das hab ich auch verschlammpert :oops:

mo_greene 13. Jun 2008 18:22

Re: Array aus TFileStream auslesen?
 
Wäre es dann so richtig?

Delphi-Quellcode:
  for i := 0 to High(Zutaten) do
  begin
    FS.Write(Zutaten[i], sizeOF(Zutaten));
  end;
Vielen Dank nochmal :)

Apollonius 13. Jun 2008 18:27

Re: Array aus TFileStream auslesen?
 
Nein, das muss SizeOf(Zutaten[i]) oder SizeOf(Basistyp) sein.

mo_greene 13. Jun 2008 18:29

Re: Array aus TFileStream auslesen?
 
Also folglich:

Delphi-Quellcode:
for i := 0 to High(Zutaten) do
  begin
    FS.Write(Zutaten[i], sizeOF(Zutaten[i]));
  end;
Danke :)

mo_greene 13. Jun 2008 19:12

Re: Array aus TFileStream auslesen?
 
Leider erhalte ich mit folgender Syntax:

Delphi-Quellcode:
  for i := 0 to High(Zutaten) do
  begin
    FS.Write(Zutaten, sizeOF(Zutaten[i]));
  end;
folgedes in der .dat Datei:

¨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?

Neutral General 13. Jun 2008 19:19

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!

mkinzler 13. Jun 2008 19:19

Re: Array aus TFileStream auslesen?
 
Was steht den in Zutaten drin/wie ist der Typ deklariert?

FAlter 13. Jun 2008 19:19

Re: Array aus TFileStream auslesen?
 
Hi,

du musst schon das entsprechende Element speichern.

Delphi-Quellcode:
for i := Low(Zutaten) to High(Zutaten) do
  begin
    FS.Write(Zutaten[i], sizeOF(Zutaten[i])); //das [i] fehlte!
  end;
Oder gleich so:

Delphi-Quellcode:
FS.Write(Zutaten[Low(Zutaten)], Length(Zutaten) * SizeOf(Zutaten[Low(Zutaten)]));
Dann werden alle Elemente in einem Rutsch gespeichert.

Mfg
FAlter

Apollonius 13. Jun 2008 19:24

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.

mo_greene 13. Jun 2008 19:27

Re: Array aus TFileStream auslesen?
 
Zitat:

Zitat von Neutral General
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!

Sorry, was ist ein Record? :oops:

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:
procedure TCocktail.SetZutaten(n: string; i: Integer);
(* Dient dazu, in das Array zu schreiben *)
begin
  Zutaten[i] := n;
end;
Speicherung des Inhalts:

Delphi-Quellcode:
  for i := 0 to High(Zutaten) do
  begin
    FS.Write(Zutaten[i], sizeOF(Zutaten[i]));
  end;
Herauskommen tut folgendes in der .dat Datei:
Delphi-Quellcode:
Í^
, was natürlich nicht dem Inhalt entspricht!


Vielen, vielen Dank! Ich hoffe mir kann jemand helfen :oops: :(

mkinzler 13. Jun 2008 19:29

Re: Array aus TFileStream auslesen?
 
Ersetze
Delphi-Quellcode:
Zutaten    : array of string;
mit
Delphi-Quellcode:
Zutaten    : array of ShortString;
oder einer bestimmten Länge.

Neutral General 13. Jun 2008 19:29

Re: Array aus TFileStream auslesen?
 
Sag doch das es Strings sind.... grml. :wall:

einen String speicherst du so ab:

Delphi-Quellcode:
l := length(String);
Write(l,SizeOf(Integer));
Write(String[1],l);
Auslesen:

Delphi-Quellcode:
Read(l,SizeOf(Integer));
SetLength(String,l);
Read(String[1],l);
das musst du jetzt eben auf dein Array übertragen

Gruß
Neutral General

DeddyH 13. Jun 2008 19:30

Re: Array aus TFileStream auslesen?
 
Was willst Du mit
Zitat:

Delphi-Quellcode:
SetLength(Zutaten,10);

erreichen?

FAlter 13. Jun 2008 19:31

Re: Array aus TFileStream auslesen?
 
Hi,

verwende doch eine Delphi-Referenz durchsuchenTStringList statt deines Arrays und deren Methode SaveToFile.

Mfg
FAlter

mo_greene 13. Jun 2008 19:32

Re: Array aus TFileStream auslesen?
 
Huch :shock:...ich habe string mit shortstring ersetzt (@mkinzler) und aufeinmal gehts :-D
Danke!!

Zitat:

Zitat von DeddyH
Was willst Du mit
Zitat:

Delphi-Quellcode:
SetLength(Zutaten,10);

erreichen?

Naja muss ich nicht sagen, wie lang das Array ist?

DeddyH 13. Jun 2008 19:35

Re: Array aus TFileStream auslesen?
 
Zitat:

Zitat von FAlter
verwende doch eine Delphi-Referenz durchsuchenTStringList statt deines Arrays und deren Methode SaveToFile.

Sehe ich auch als einfacher an.

Zitat:

Zitat von mo_greene
Naja muss ich nicht sagen, wie lang das Array ist?

Schon, aber wenn es immer 10 sind, kannst Du es doch gleich als array[0..9] deklarieren.

mo_greene 13. Jun 2008 19:38

Re: Array aus TFileStream auslesen?
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von FAlter
verwende doch eine Delphi-Referenz durchsuchenTStringList statt deines Arrays und deren Methode SaveToFile.

Sehe ich auch als einfacher an.

Ja okay, aber momentan funktioniert es, so wie es ist und ich habe aus dem String-Array nur ein ShortString-Array gemacht. Ich lasse es lieber erstmal so :-D Trotzdem vielen Dank!

Zitat:

Zitat von DeddyH
Zitat:

Zitat von mo_greene
Naja muss ich nicht sagen, wie lang das Array ist?

Schon, aber wenn es immer 10 sind, kannst Du es doch gleich als array[0..9] deklarieren.

Ja da hast du recht. Kann ich die Länge auch weglassen, wenn der Array dynamisch wachsen soll? Also, je nachdem wieviele Einträge reingeschrieben werden während der Laufzeit?

DeddyH 13. Jun 2008 19:39

Re: Array aus TFileStream auslesen?
 
Nee, wenn Du eine Größe angibst, gilt diese auch.

mo_greene 13. Jun 2008 19:45

Re: Array aus TFileStream auslesen?
 
Und wenn ich keine Angebe?

Neutral General 13. Jun 2008 19:46

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 03:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz