Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Typorisierte Datei wird nicht gelesen (https://www.delphipraxis.net/72833-typorisierte-datei-wird-nicht-gelesen.html)

arbu man 7. Jul 2006 16:22


Typorisierte Datei wird nicht gelesen
 
Hi,

Ich lese mit folgenden code eine typorisierte Datei aus:
Delphi-Quellcode:
// 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;
Leider bleibt der array leer aber in der datei stehen daten, es kommt aber kein fehler was läuft da falsch ?

mfg, Björn

RavenIV 7. Jul 2006 16:32

Re: Typorisierte Datei wird nicht gelesen
 
lass mal die Deklarationen von
Delphi-Quellcode:
// TFunktionenArray: array of TFunktion
// TFunktion: record
// TFunktionenDatei = File of TFunktion;
sehen.
Du musst schon ein Bisschen mehr Code rausrücken, damit man Dir helfen kann...

arbu man 7. Jul 2006 16:34

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;

Michael Habbe 7. Jul 2006 16:52

Re: Typorisierte Datei wird nicht gelesen
 
Müsste das nicht File of TFunktionenDatei heissen?

Zitat:

Zitat von arbu man
Delphi-Quellcode:
function FunktionenLesen(FileName: String): TFunktionenArray;
var
  Datei: TFunktionenDatei;
         ^^^^^
  i, count: integer;
begin
...
end;


Was ist das für ein Typ?

Zitat:

Zitat von arbu man
Delphi-Quellcode:
    Params: array[1..32] of TParameter;


MrSpock 7. Jul 2006 17:28

Re: Typorisierte Datei wird nicht gelesen
 
Hallo arbuman,

wie rufst du diese Funktion denn auf?

Zacherl 7. Jul 2006 17:30

Re: Typorisierte Datei wird nicht gelesen
 
[etwas Off-Topic]
Heißt das nicht typisierte Datei anstelle von typorisierte Datei :gruebel:
[/etwas Off-Topic]

Union 7. Jul 2006 17:33

Re: Typorisierte Datei wird nicht gelesen
 
Müsste es nicht vilmehr so heißen:
Delphi-Quellcode:
Seek(Datei, i*Sizeof(TFunktion));

MrSpock 7. Jul 2006 17:40

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.

arbu man 7. Jul 2006 17:55

Re: Typorisierte Datei wird nicht gelesen
 
Also alle weiteren typen im record sind:
Delphi-Quellcode:
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;
Aufrufen tue ich das ganze mit:
Delphi-Quellcode:
begin
  if opendialog.Execute then begin
    FunktionenLesen(opendialog.filename, fa);
    _update; // array einlesen
  end;
end;

Khabarakh 7. Jul 2006 18:19

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]

arbu man 7. Jul 2006 18:22

Re: Typorisierte Datei wird nicht gelesen
 
Hab das ganze so veränder das der array als var übergeben wird:
Delphi-Quellcode:
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;
[OT]
Ne ich meinte recordierte Dateien :)
[/OT]

marabu 7. Jul 2006 18:27

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

Klaus01 7. Jul 2006 18:29

Re: Typorisierte Datei wird nicht gelesen
 
Delphi-Quellcode:
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;
Nachgeschoben noch einige Erklärungen:

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

arbu man 7. Jul 2006 18:31

Re: Typorisierte Datei wird nicht gelesen
 
Das war es := Danke :D

Hawkeye219 8. Jul 2006 01:16

Re: Typorisierte Datei wird nicht gelesen
 
Wenn die Datei ganz gelesen werden soll, dann geht das auch so:

Delphi-Quellcode:
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;
Gruß Hawkeye

Muetze1 8. Jul 2006 13:06

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