Typorisierte Datei wird nicht gelesen
Hi,
Ich lese mit folgenden code eine typorisierte Datei aus:
Delphi-Quellcode:
Leider bleibt der array leer aber in der datei stehen daten, es kommt aber kein fehler was läuft da falsch ?
// TFunktionenArray: array of TFunktion
// TFunktion: record // TFunktionenDatei = File of TFunktion; function FunktionenLesen(FileName: String): TFunktionenArray; var Datei: TFunktionenDatei; i, count: integer; begin AssignFile(Datei, FileName); // Datei zuweisen Reset(Datei); // Datei öffnen count:= FileSize(Datei) div sizeof(TFunktion); setlength(result, count); for i:=0 to count -1 do begin Seek(Datei, i); // Datensatzzeiger an gewünschte Position // bewegen Read(Datei, result[i]); // die aktuellen Werte lesen end; CloseFile(Datei); // Datei schließen end; mfg, Björn |
Re: Typorisierte Datei wird nicht gelesen
lass mal die Deklarationen von
Delphi-Quellcode:
sehen.
// TFunktionenArray: array of TFunktion
// TFunktion: record // TFunktionenDatei = File of TFunktion; Du musst schon ein Bisschen mehr Code rausrücken, damit man Dir helfen kann... |
Re: Typorisierte Datei wird nicht gelesen
Okay also hier sind sie:
Delphi-Quellcode:
type
TFunktion = packed record Name: String[255]; _Unit: String[255]; Deklaration: String[255]; Params: array[1..32] of TParameter; Beschreibung: LongString; Beispiel: LongString; end; type TFunktionenArray = array of TFunktion; TFunktionenDatei = File of TFunktion; |
Re: Typorisierte Datei wird nicht gelesen
Müsste das nicht File of TFunktionenDatei heissen?
Zitat:
Was ist das für ein Typ? Zitat:
|
Re: Typorisierte Datei wird nicht gelesen
Hallo arbuman,
wie rufst du diese Funktion denn auf? |
Re: Typorisierte Datei wird nicht gelesen
[etwas Off-Topic]
Heißt das nicht typisierte Datei anstelle von typorisierte Datei :gruebel: [/etwas Off-Topic] |
Re: Typorisierte Datei wird nicht gelesen
Müsste es nicht vilmehr so heißen:
Delphi-Quellcode:
Seek(Datei, i*Sizeof(TFunktion));
|
Re: Typorisierte Datei wird nicht gelesen
Hallo,
nein, seek(Datei, i) ist korrekt. Eine typisierte Datei kennt die Länge der Datensätze. Aber die Rückgabe eines Arrays, dessen Länge erst in der Procedur ermittelt wird ist schwierig. Arbeite lieber mit einem VAR Parameter für die Rückgabe, dann wir die Längenanpassung auf das übergebenen Array angewendet. |
Re: Typorisierte Datei wird nicht gelesen
Also alle weiteren typen im record sind:
Delphi-Quellcode:
Aufrufen tue ich das ganze mit:
type
LongString = record Len: integer; Content: array[1..1024] of char; // 1 KB end; type TParameter = packed record Pas: String[255]; Doku: String[255]; end;
Delphi-Quellcode:
begin
if opendialog.Execute then begin FunktionenLesen(opendialog.filename, fa); _update; // array einlesen end; end; |
Re: Typorisierte Datei wird nicht gelesen
Ist ja nett, wenn du in der Zwischenzeit deine Funktionen abänderst, aber vielleicht solltest du dann auch den neuen Quellcode zeigen.
(Die Signatur von "FunktionenLesen" ist im ersten Beitrag anders als im letzten und um genau diese ging es Mr. Spock) [OT] @Florian: Wahrscheinlich meint er vaporisierte Dateien, mit denen hab ich auch schon leidliche Erfahrungen :stupid: . [/OT] |
Re: Typorisierte Datei wird nicht gelesen
Hab das ganze so veränder das der array als var übergeben wird:
Delphi-Quellcode:
[OT]
procedure FunktionenLesen(FileName: String; var f :TFunktionenArray);
var Datei: TFunktionenDatei; i, count: integer; begin AssignFile(Datei, FileName); // Datei zuweisen Reset(Datei); // Datei öffnen count:= FileSize(Datei) div sizeof(TFunktion); setlength(f, count); for i:=0 to count -1 do begin Seek(Datei, i); // Datensatzzeiger an gewünschte Position // bewegen Read(Datei, f[i]); // die aktuellen Werte lesen end; CloseFile(Datei); // Datei schließen end; Ne ich meinte recordierte Dateien :) [/OT] |
Re: Typorisierte Datei wird nicht gelesen
Hi.
FileSize liefert die Anzahl der Datensätze, die integer division durch RecordSize (relative große Zahl) ergibt 0 als Count ... Grüße vom marabu |
Re: Typorisierte Datei wird nicht gelesen
Delphi-Quellcode:
Nachgeschoben noch einige Erklärungen:
procedure FunktionenLesen(FileName: String; var f :TFunktionenArray);
var Datei: TFunktionenDatei; i, count: integer; begin AssignFile(Datei, FileName); // Datei zuweisen Reset(Datei); // Datei öffnen count:= FileSize(Datei); setlength(f, count); for i:=0 to count -1 do begin Read(Datei, f[i]); // die aktuellen Werte lesen end; CloseFile(Datei); // Datei schließen end; seek(datei,i) brauch man nur wenn man sich frei in der Datei bewegen will. Du wolltest die Datei von vorne bis hinten lesen. Mit reset hast Du Dich bereits an den Dateianfang bewegt. Ein read bewegt Dich immer einen einen Datensatz weiter. FileSize liefert bei einer typisierten Datei die Anzahl der Datensätze und nicht die Größe der Datei in Bytes. Grüße Klaus |
Re: Typorisierte Datei wird nicht gelesen
Das war es := Danke :D
|
Re: Typorisierte Datei wird nicht gelesen
Wenn die Datei ganz gelesen werden soll, dann geht das auch so:
Delphi-Quellcode:
Gruß Hawkeye
procedure FunktionenLesen (const FileName: String; var f: TFunktionenArray);
begin with TFileStream.Create(FileName, fmOpenRead) do begin SetLength (f, Size div SizeOf(f[0])); if (Size > 0) then Read (f[0], Size); Free; end; end; |
Re: Typorisierte Datei wird nicht gelesen
Gar kein Resourcen-Schutzblock um bei einem Lesefehler immernoch die Datei zu schliessen bzw. den FileStream freizugeben?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz