Einzelnen Beitrag anzeigen

delphinewbie

Registriert seit: 27. Aug 2010
47 Beiträge
 
#1

Datei mit FileStream auslesen

  Alt 27. Aug 2010, 08:36
Delphi-Version: 2005
Guten Morgen Delphi-Gemeinde,
ich habe mich hier gerade angemeldet und das nicht ohne Grund. Ich bin gerade dabei, mich ein wenig ins Delphi einzuarbeiten und auf der Suche nach geballtem Wissen bin ich nun hier gelandet. Ich habe den Eindruck, dass mir hier geholfen werden kann. Also wie gesagt, ich bin ein absoluter Einsteiger und ich hoffe, dass ihr mir meine vllt. primitiven Fehler verzeiht. Doch nun zu meinem Problem :
Ich möchte eine typisierte (oder heißt das strukturierte ) Datei (Byte für Byte) auslesen und die darin enthaltenen Daten natürlich weiterbearbeiten. Mir ist auch bekannt, wie diese Datei aufgebaut ist, d.h. wo steht ein String, wie lang ist er, wo steht ein integer u.s.w. und ich erhalte auch sinnvolle Daten, wie sie zu erwarten wären. Leider erhalte ich dann jedoch beim Beenden des Programms (in der IDE) eine Fehlermeldung.

Im Projekt xxx.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung : 'Zugriffsverletzung bei Adresse 0040438A in Modul 'xxx.exe'. Lesen von Adresse 00000018'.
Prozess wurde angehalten. Mit einzelne Anweisung oder Start fortsetzen.

Starte ich die xxx.exe bspw. aus dem Windows-Explorer, kommt nach Programmbeendigung die Meldung :
xxx.exe funktioniert nicht mehr
Windows kann online nach einer Lösung für das Problem suchen.
u.s.w blabla....


Quellcode (Ausschnitt) :

type

bytes = record

// Global section
FileID : word;
data_offset : Longint;
L_of_Filecomment : word;
Filecomment : string;
Length_of_Reserve_string : array[1..32] of byte;
Reserve_string : array[1..32] of string;
end;

var
Form1: TForm1;
f : TFileStream;
ds: bytes;

implementation
.
.
.

if OpenDialog1.Execute then
begin
f:=(TFileStream.Create(OpenDialog1.FileName,fmOpen Read));
pfad:= OpenDialog1.FileName;

with f do begin
Read(ds.FileID,sizeof(word));
Read(ds.data_offset,sizeof(longint));
Read(ds.L_of_Filecomment,sizeof(word));
if ds.L_of_Filecomment <> 0 then
Read(ds.Filecomment[1],ds.L_of_Filecomment);
for i:=1 to 32 do begin
Read(ds.Length_of_Reserve_string[i],sizeof(word));
Read(ds.Reserve_string[i],ds.Length_of_Reserve_string[i]);
end;

Read(ds.NofChan,sizeof(word));
Read(ds.max_chan_length,sizeof(longint));
.
.
.
.
end; // end with f do
f.Free;
end; // if OpenDialog1.Execute
.
.

Das Eigenartige an der Sache ist jedoch, dass diese Fehler nicht auftreten, wenn alles ab der for-Schleife auskommentiert wird. Beginnt die Auskommentierung nur 3 Zeilen weiter, also bei Read(ds.NofChan,sizeof(word));, habe ich schon die Fehlermeldung!!! Hängt es irgendwie mit der for-Schleife zusammen oder mache ich bei den String-Arrays Fehler ?
Hat jemand eine Idee zu diesem sicherlich einfachen Problem ?
Vielen Dank,
delphinewbie
  Mit Zitat antworten Zitat