Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dyn Array mit Werten aus Datei füllen (https://www.delphipraxis.net/94661-dyn-array-mit-werten-aus-datei-fuellen.html)

Rungholt 25. Jun 2007 08:35


Dyn Array mit Werten aus Datei füllen
 
Hallo,

ich möchte eine untypisierte Datei in ein dynamisches Array einlesen. Ich bekam nach einiger Zeit immer Speicherprobleme.
Laut diesen Textes hier http://www.dsdt.info/insider/sprache...hermanager.php
sollte man in Delphi die Länge des dynamischen Array nicht in einer Schleife, sondern wenn möglich schon vorher setzen.
Da ich die Dateigröße habe und auch die Größe des Records, sollte das kein Problem sein... dachte ich :lol:
Aber wie genau ermittle ich die Größe, die das Array haben muss ? Ein SizeOf(f) wird nicht reichen, oder ?

Hier die Details:

Delphi-Quellcode:
type
   rMyRecord= record
      TimeStamp : String;
      WerteID  : String;
      Wert     : String;
   end;

var DatenArray : array of rMyRecord;
    f         : File;


SetLength(DatenArray,????);

DeddyH 25. Jun 2007 08:41

Re: Dyn Array mit Werten aus Datei füllen
 
Zitat:

Zitat von Delphi-Hilfe
Die Funktion FileSize gibt die Größe einer Datei in Byte zurück. Enthält die Datei Records, wird deren Anzahl zurückgegeben.

Dazu musst Du f als file of Dein_Record deklarieren.

jfheins 25. Jun 2007 09:26

Re: Dyn Array mit Werten aus Datei füllen
 
Du öffenest den Filestream, setzt die länge des arrays auf Filestream.size DIV sizeof(record) und kannst dann die einträge einlesen.

DerDan 25. Jun 2007 09:31

Re: Dyn Array mit Werten aus Datei füllen
 
Hallo,

ich denke das ->
Zitat:

Zitat von jfheins
Du öffenest den Filestream, setzt die länge des arrays auf Filestream.size DIV sizeof(record) und kannst dann die einträge einlesen.

<- würde schon funktionieren. Aber du müsstest deine Strings gegen andere Variablen tauschen die von der länge her nicht dynamisch sind.


mfg


DerDan

Rungholt 25. Jun 2007 09:42

Re: Dyn Array mit Werten aus Datei füllen
 
Hi,

ich kann die Strings zwar begrenzen...

Delphi-Quellcode:
   rMyRecord= record
      TimeStamp : String[25];
      WerteID  : String[10];
      Wert     : String[255];
   end;
... Das Problem ist dennoch, dass die Größe der Sätze in meiner Datei durchaus unterschedlich ausfallen können.
Dass heißt, ich kann die Gesamtgröße der Datei nicht einfach durch die Größe des Records (wäre dann jetzt 290)
teilen... oder Doch ? :gruebel:

Rungholt 25. Jun 2007 09:52

Re: Dyn Array mit Werten aus Datei füllen
 
Also so wie ich das sehe, muss ich vom Worstcase ausgehen. Das Wäre dann Filesize div 3. Weil im ungünstigsten Fall in jedem
Recordelement nur ein Zeichen drinstehen könnte.

Das wäre dann beim Beispiel von einer 1000 Byte großen Datei 334 Elemente im Array.
Würde ich die Dateigröße nur durch die Recordgröße dividieren bekäme ich in diesem Beispiel einen Wert von
aufgerundet 4 Array-Elementen. Aber wie gesagt, die Sätze sehen von ihrer Größe in der Datei äußerst unterschiedlich aus.

DeddyH 25. Jun 2007 10:23

Re: Dyn Array mit Werten aus Datei füllen
 
Hast Du das mal ausprobiert? AFAIK wird immer SizeOf(Record) * Anzahl_Records in die Datei geschrieben, unabhängig davon, wieviel Speicher im jeweiligen Record tatsächlich benutzt wird.

Rungholt 25. Jun 2007 10:38

Re: Dyn Array mit Werten aus Datei füllen
 
Ich schreibe in eine "untypisierte" Datei. Also nicht Record- sondern Byteweise. Das heißt so gesehen stehen
keine Records in der Datei, sondern eine riesige Zeichenkette, die ich erst beim Auslesen in eine Struktur bringe.

DeddyH 25. Jun 2007 10:42

Re: Dyn Array mit Werten aus Datei füllen
 
Achso, dann ist das was anderes.

shmia 25. Jun 2007 10:56

Re: Dyn Array mit Werten aus Datei füllen
 
Zitat:

Zitat von Rungholt
Ich schreibe in eine "untypisierte" Datei. Also nicht Record- sondern Byteweise. Das heißt so gesehen stehen
keine Records in der Datei, sondern eine riesige Zeichenkette, die ich erst beim Auslesen in eine Struktur bringe.

Dann verwende doch gleich eine "vernünftige" Technik wie z.B. XML.
Falls XML für dich zu viel Overhead bedeutet, dann gäbe es da auch noch JSON.
JSON Delphi Library


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:55 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