![]() |
Datei binär auslesen (Delhpi 7)
Hi,
ich versuche gerade eine DB-Datei binär auszulesen. Mit dem Header hat das soweit auch gut geklappt. Nur mit den Daten habe ich ein Problem (was sicherlich zwischen meinen Ohren sitzt). Hier mal ein bisschen Code:
Delphi-Quellcode:
Mir ist nicht klar, warum hier eine Zugriffsverletzung auftreten kann.
TDatenArray = array of Byte;
. . . Procedure DatenAuslesen(fs: TFileStream); var fieldcount: Integer; EndOfFields: Boolean; i, f, d: Integer; c: Integer; Feldname: string; daten: TDatenArray; fieldbytes: Integer; fieldoffset: Integer; fieldtext: string; newposition: Integer; bytesread: Integer; begin //Hier passieren noch einige Dinge //Alle unten aufgeführten Vars werden initialisiert //Zur Demo setzt ich notwenige Daten direkt Datasize=1607; SetLength(daten, DataSize); //Setze Zeiger auf ersten Datensatz newposition:=fs.Seek(DataOffset, soFromBeginning); for i:=0 to 100 do begin //Alle Datensätze durch gehen (erstmal nur die ersten 100) bytesread:=fs.Read(daten, DataSize); fieldoffset:=0; if bytesread=DataSize then begin for f:=1 to 10 do begin //Alle Felder durchgehen (erstmal nur die ersten 10) fieldbytes:=StrToInt(sg_tabellenstructur.Cells[2, f]); fieldtext:=''; case StrToInt(sg_tabellenstructur.Cells[5, f]) of 67: begin for d:=0 to fieldbytes-1 do fieldtext:=fieldtext+chr(daten[d+fieldoffset]); //Hier tritt ein Fehler Zugriffsverletzung auf. d ist dann 0 und fieldoffset ist 40. end; end; sg_Daten.Cells[f, i+1]:=fieldtext; fieldoffset:=fieldoffset+fieldbytes; end; end else Exit; end; end; Ich habe den Code mal soweit eingekürzt, damit nichts unnötiges hier steht. Laut Bytesread müssten doch exakt soviel Bytes gelesen worden sein, dass das Daten-Array entsprechend gefüllt ist. Und wenn das Daten-Array nicht vorhanden wäre, dann müsste ja schon die read-operation fehlschlagen. Der Debugger zeigt mir nach der SetLength-Funktion auch das Array entsprechend an (Angezeigt wird: (0,0,0,0,0,....) ), aber nach read-Funktion sieht es im Debugger so aus, als hätte das Array eine länge von 0 (Angezeigt wird: () ) |
AW: Datei binär auslesen (Delhpi 7)
Ich bin mir fast sicher, dass Delphi 7 noch kein TStream.Read mit TBytes-Parameter kennt,
als
Delphi-Quellcode:
=>
fs.Read(daten, DataSize);
Delphi-Quellcode:
, denn du willst ja den Array-Inhalt und nicht den Array-Zeiger überschreiben, da der Compiler bestimmt die Variante mit dem offenen VAR-Parameter verwendet. :stupid:
fs.Read(daten[0], DataSize);
![]() ![]() |
AW: Datei binär auslesen (Delhpi 7)
Naja, beim Header klappt's ja ganz gut
Delphi-Quellcode:
Der einzige Unterschied den ich sehe ist, dass ihr hier ein statisches Array habe.
TDBHeader = array[0..31] of Byte;
. . . TForm1 = class(TForm) . . private inputFS: TFileStream; DBHeader: TDBHeader; . . end; . . . . procedure TForm1.GetHeader(fs: TFileStream); begin fs.Read(DBHeader, SizeOf(DBHeader)); end; |
AW: Datei binär auslesen (Delhpi 7)
Der Header ist aber auch ein statisches Array und das ist wie ein Record.
Ein dynamisches Array ist aber ein Pointer, der dann auf den Arrayinhalt zeigt. Und ohne Dereferenzierung schreibst du dann in den Pointer und nicht in die Daten. Beim Statischen sind die Daten dagegen direkt in der Variable drin. SizeOf(Daten) = 4 SizeOf(DBHeader) = mehr |
AW: Datei binär auslesen (Delhpi 7)
Ahhhh.....dann verstehe ich das.
Danke. |
AW: Datei binär auslesen (Delhpi 7)
Darum am Besten immer Dereferenzieren, egal ob statisch oder dynamisch ... da kann dann nie was schief gehen.
Entweder
Delphi-Quellcode:
oder du sagst "bei mir beginnt Statisches immer bei 0", dann
Datan[Low(Daten)]
Delphi-Quellcode:
.
Datan[0]
|
AW: Datei binär auslesen (Delhpi 7)
Wenn Du auch dynamische Arrays nutzt, dann gewöhn Dir z.B. fs.read(meinarray,anzahl); ganz schnell ab und mach es so
Delphi-Quellcode:
Das geht soweit ich weiß bei statischen und Dynamischen Arrays und funktioniert dann immer.
fs.read(Meinarray[low],anzahl);
(also immer wenn Du auf ein Array zugreifen willst, nur über den Index gehen) Gruß K-H Edith: seit wann
Delphi-Quellcode:
? Ich kenn es nur ohne Angabe des Arrays.
low(MeinArray)
|
AW: Datei binär auslesen (Delhpi 7)
Ich brauch doch noch etwas Unterstützung bei der Umsetzung.
Wenn ich das so mache:
Delphi-Quellcode:
Dann knallt es bei SetLength.
PDatenArray = Array of Byte;
TDAtenArray = ^PDatenArray; procedure .... var Daten = TDatenArray; begin Datasize=1607; SetLength(Daten^,Datasize); . . . . end; |
AW: Datei binär auslesen (Delhpi 7)
Zitat:
|
AW: Datei binär auslesen (Delhpi 7)
Delphi-Quellcode:
Gruß
setlength(Daten,AnzahlElemente);
K-H Zitat:
|
AW: Datei binär auslesen (Delhpi 7)
Low:
![]() |
AW: Datei binär auslesen (Delhpi 7)
Danke euch beiden für die schnelle Hilfe. Jetzt klappt es so wie gewünscht.
|
AW: Datei binär auslesen (Delhpi 7)
:oops::oops:
vertan! K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 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