Delphi-PRAXiS

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().

Hawkeye219 23. Dez 2006 12:04

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

eine kleine Korrektur:

Delphi-Quellcode:
// ReadBuffer(xy[0], Length(xy));
ReadBuffer(xy[0], Length(xy) * SizeOf(Single)); // ReadBuffer erwartet Anzahl Bytes
Man könnte auch den Wert von Size übergeben. Dies führt aber zu Problemen, falls Size kein ganzzahliges Vielfaches von SizeOf(Single) ist.

Gruß Hawkeye

danieleh 23. Dez 2006 17:39

Re: Binäre Datei lesen - 2 Werte gleichzeitig
 
hallo Hawkeye219

Herzlichen Dank für die Korrektur - werde über die Feiertage Zeit haben dies umzusetzen

Schönes Fest an Euch allen
Daniele


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