Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array als Datei speichern (https://www.delphipraxis.net/14599-array-als-datei-speichern.html)

hummer 12. Jan 2004 12:20


Array als Datei speichern
 
Hallo.
Ich möchte mit einem Programm ein Array als Datei abspeichern und auch wieder öffnen und auslesen. Wie kann ich das realisieren?

maximov 12. Jan 2004 12:33

Re: Array als Datei speichern
 
Hi.

Das kommt auf das array an. Statisches oder dynamisches / ein oder mehrdimensional?

Ich würde auf jeden fall streams verwenden. Wenn dann noch statisch ist, dann kannste es in einem rutsch in die datei streamen:

zb.
Delphi-Quellcode:
var fs:TFileStream;
    arr:array[0..99] od integer;
...
fs:=TFileStream.create('c:\array.dat',fmCreate);
try
  fs.write(arr,sizeOf(arr));
finally
 fs.free;
end;
cu

hummer 12. Jan 2004 12:38

Re: Array als Datei speichern
 
Danke schonmal.
Das Array ist eindimensional und statisch.

Und wie lese ich das Array jetzt wieder aus?

H4ndy 12. Jan 2004 12:45

Re: Array als Datei speichern
 
Das geht relativ einfach über eine TStringList und FOR-Schleifen:

Delphi-Quellcode:
var map: array [1..256] of byte;
...
procedure Thaupt.Save(Sender: TObject);
var StrList: TStrings;
    i: integer;
begin
  if SaveDialog1.Execute then begin
    StrList := NIL;
    try
      StrList := TStringList.Create;
      for i:=1 to 256 do begin
        StrList.Add(IntToStr(map[i]));
      end;
      StrList.SaveToFile(SaveDialog1.FileName);
    finally
      StrList.Free;
    end;
  end;
end;

procedure Thaupt.Open(Sender: TObject);
var StrList: TStrings;
    i: integer;
begin
  if OpenDialog1.Execute then begin
    StrList := NIL;
    try
      StrList := TStringList.Create;
      StrList.LoadFromFile(OpenDialog1.FileName);
      for i:=1 to 256 do begin
        map[i] := StrToInt(StrList[i]);
      end;
    finally
      StrList.Free;
    end;
  end;
Sollte auch einfach auf andere Typen anwendbar sein.

maximov 12. Jan 2004 22:37

Re: Array als Datei speichern
 
@H4ndy: Wers möglichst dirty und nicht binär haben will, der soll es so machen, wie du vorschlägst :mrgreen:


Zitat:

Zitat von hummer
Danke schonmal.
Das Array ist eindimensional und statisch.

Und wie lese ich das Array jetzt wieder aus?

ungefähr so:

Delphi-Quellcode:
var fs:TFileStream;
    arr:array[0..99] od integer;
...

if fileExists('c:\array.dat') then
begin
  fs:=TFileStream.create('c:\array.dat',fmOpenRead);
  try
    if fs.size >= sizeOf(arr)
    then fs.read(arr,sizeOf(arr));
  finally
    fs.free;
  end;
end else showMessage('foobar not da');
cu.

H4ndy 13. Jan 2004 20:14

Re: Array als Datei speichern
 
Zitat:

Zitat von maximov
@H4ndy: Wers möglichst dirty und nicht binär haben will, der soll es so machen, wie du vorschlägst :mrgreen:

Was dagegen :mrgreen:
Quick'n'Dirty ist mein zweiter Vorname :zwinker:

@maximov:
Klappt das mit dem FileStream auch für 2-dimensionale Arrays?

maximov 14. Jan 2004 10:11

Re: Array als Datei speichern
 
Zitat:

Zitat von H4ndy
...
@maximov:
Klappt das mit dem FileStream auch für 2-dimensionale Arrays?

Wenn es statisch ist, ja! Denn dann liegt es in einem stück im speicher.

cu.

hummer 21. Jan 2004 20:30

Re: Array als Datei speichern
 
Kann ich denn auch dynamische Array mit FileStream abspeichern?

Luckie 21. Jan 2004 20:35

Re: Array als Datei speichern
 
Zitat:

Zitat von maximov
Wenn es statisch ist, ja! Denn dann liegt es in einem stück im speicher.

Gilt auch für dynamische. Und aus diesem Grund sollte man sie auch nicht immer nur um ein einzelnes Element vergrößern. Dabei reserviert der Speichermanager von Delphi nämlich jedes mal neuen Speicher für das vergrößerte Array und kopiert das alte, kürzere in den neuen Speicherbereich. Der alte wird dabei aber nicht an Windows zurückgegeben.

maximov 21. Jan 2004 22:11

Re: Array als Datei speichern
 
Da hast du natürlich recht :cyclops:

Ich fake gern dynamische arrays mit statischer deklaration als pointer und um die reservierung kümmere ich mich dann selbst (zb. für DirectX programmierung sehr praktisch)...man muss sich nur die länge der gültigen daten merken.

@Hummer: sollte auch kein prob sein. evtl. musst du einfach auf das erste element referenzieren und dann length()-bytes lesen:

Delphi-Quellcode:
if length(arr)>0 then fs.write(@arr[0]^,length(arr)*sizeOf(Element));
oder so.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 Uhr.
Seite 1 von 4  1 23     Letzte »    

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