Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Binäre Datei lesen - 2 Werte gleichzeitig (https://www.delphipraxis.net/82962-binaere-datei-lesen-2-werte-gleichzeitig.html)

danieleh 23. Dez 2006 10:56


Binäre Datei lesen - 2 Werte gleichzeitig
 
Liebe Gemeischaft

Ich zerbreche mir den Kopf über folgendes Problem mit einer Schleife:

Ich habe binäre Dateien in deren jeweils eine Serie von Werten stehen (single type). Diese sind sequenziell angeordnet, aber die erste Hälfte sind X-Werte und die zweite hälfte sind Y-Werte und ich kenne die Anzahl X-Werte (n).

zb: 1.2345 2.3456 3.4567 4.5678 5.6789 6.7890 (n=3, X-Werte: 1.2345 2.3456 3.4567, Y-Werte: 4.5678 5.6789 6.7890) - eigentlich gibt es keinen Abstand zwischen den Werten, aber die Länge der einzelnen Werten ist ja bekannt.

Nun müsste ich in einer Schleife die entsprechenden X & Y-Werte-paare auslesen und übergeben (X=1.2345,Y=4.5678, ...).

Habe (u.a) folgendes versucht, wobei es nun am Seek zu scheitern scheint:

Delphi-Quellcode:
 
var
  k, BinSize: integer;
  BinDat: array of Real;
  BinFile : TStream;
  Xnum, Ynum, t: single;
  ...

  SetLength(BinDat, BinSize);
  BinSize:= n*2;
   
   for k := 0 to BinSize-n-1 do
    begin
      BinFile.Read(t, 4); // lese single, 4 bites
      BinDat[k]:=t;
      Xnum:=BinDat[k];
      Seek(BinFile, BinSize-n+k);
      BinFile.Read(t, 4);
      BinDat[k]:=t;
      Ynum:=BinDat[k];
      AddXY(Xnum,Ynum); // fügt Werte-paar in TeeChart-Serie ein
    end;
Wüsste mir jemand Rat geben ?

mkinzler 23. Dez 2006 10:59

Re: Binäre Datei lesen - 2 Werte gleichzeitig
 
Ich würde zuerst alle Werte sequentiell Einlesen und dann erst nach x/y Trennen.

danieleh 23. Dez 2006 11:07

Re: Binäre Datei lesen - 2 Werte gleichzeitig
 
Oh - das war schnell :-)

aber wohin damit in der zwischenzeit - und wie dann auftrennen ?

mkinzler 23. Dez 2006 11:09

Re: Binäre Datei lesen - 2 Werte gleichzeitig
 
Zitat:

aber wohin damit in der zwischenzeit
Z.B. in einen Array
Zitat:

- und wie dann auftrennen ?
Damit meinte ich Unterscheiden ob X oder Y.

danieleh 23. Dez 2006 11:16

Re: Binäre Datei lesen - 2 Werte gleichzeitig
 
Habe eigentlich zuwenig erfahrung mit Arrays! - hättest du mir ein beispielcode ? Das Array müsste ich dann wieder lesen können, und ich stünde vor dem gleichen Problem.

mkinzler 23. Dez 2006 11:23

Re: Binäre Datei lesen - 2 Werte gleichzeitig
 
Zitat:

Das Array müsste ich dann wieder lesen können, und ich stünde vor dem gleichen Problem.
Nein, da man auf Arrays indiziert zugreifen kann.
Zitat:

hättest du mir ein beispielcode ?
Ja, du machst das ja schon fast richtig:

Delphi-Quellcode:
var
  k, BinSize: integer;
  BinDat: array of Real;
  BinFile : TStream;
  Xnum, Ynum, t: single;
  ...

  BinSize:= n*2;
  SetLength(BinDat, BinSize);
   
   for k := 0 to BinSize-1 do
    begin
      BinFile.Read(t, 4); // lese single, 4 bites
      BinDat[k]:=t;
    end;
   for k = 0 to n-1 do
   begin
      AddXY(BinDat[k],BinDat[k+n]); // fügt Werte-paar in TeeChart-Serie ein
   end;

danieleh 23. Dez 2006 11:31

Re: Binäre Datei lesen - 2 Werte gleichzeitig
 
Hey cool -
bin nun aber duch meine beschränkten Kenntnisse verunsichert - wird dadurch nicht die erste for-Schleife (für X-Werte) vollständig durchgelafen bevor die zweite (für Y-Werte) zum Zuge kommt - sodass sich die Werte gar nich paaren ?

marabu 23. Dez 2006 11:32

Re: Binäre Datei lesen - 2 Werte gleichzeitig
 
Hi,

wenn der Buffer schon groß genug angelegt wird um alle Werte aufzunehmen, dann könnte man auch mit nur einem einzigen Lesebefehl operieren:

Delphi-Quellcode:
function LoadValues(cs: TChartSeries; fn: TFileName): Integer;
var
  s: TStream;
  i, n: Integer;
  xy: TSingleDynArray;
begin
  with TFileStream.Create(fn, fmOpenRead or fmShareDenyWrite) do
  begin
    SetLength(xy, Size div SizeOf(Single));
    ReadBuffer(xy[0], Length(xy));
    cs.Clear;
    n := Length(xy) div 2;
    for i := 0 to Pred(n) do
      cs.AddXY(xy[i], xy[i + n]);
    Free;
  end;
end;
Freundliche Grüße

danieleh 23. Dez 2006 11:42

Re: Binäre Datei lesen - 2 Werte gleichzeitig
 
Hallo marabu

Danke für dein Tip. Den Buffer groß genug anlegen - heisst das mit dem TSingleDynArray ?

Besten Dank natürlich auch an mkinzler !

marabu 23. Dez 2006 11:56

Re: Binäre Datei lesen - 2 Werte gleichzeitig
 
TSingleDynArray ist ein array of Single aus der Unit Types. Dimensioniert habe ich es mittels SetLength().


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr.
Seite 1 von 2  1 2      

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