AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record Array speichern und lesen...Error

Ein Thema von Codix32 · begonnen am 11. Sep 2010 · letzter Beitrag vom 12. Sep 2010
Antwort Antwort
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#1

Record Array speichern und lesen...Error

  Alt 11. Sep 2010, 14:03
Delphi-Version: 2005
Hallöchen

ich kriegs nicht hin. Möchte ein dynamisches Record Array, das in eine Datei gespeichert ist auslesen und kriege ständig Fehlermeldungen.

Habe die Leseroutine im Internet gefunden und komme insbesonders mit der 'Blockread Procedur' nicht klar.

Die gefundene Routine weißt wohl schon einen Fehler auf, nämlich hier:
Delphi-Quellcode:
procedure ReadFile(filename:string);
var fil: file;
        i: integer;
        num: word; {allows up to 65535 records}
ver: byte;
 
   function ReadString:ShortString;
   begin {ReadString}
     BlockRead(fil,result,1); {Read the length of the string}
     BlockRead(fil,s[1],length(s)); //<- s ist nirgends declariert
   end; {ReadString}

begin {ReadFile}
...
...
Ich habe versucht , einfach in der Funktion eine Variable vom Typ Shortstring zu erstellen:
Delphi-Quellcode:
  function ReadString:ShortString;
   var
   s:string;
   begin {ReadString}
     BlockRead(fil,result,1); {Read the length of the string}
     BlockRead(fil,s[1],length(s)); {Read the string itself}
   end; {ReadString}
Funzt nicht. Was passiert hier eigentlich? Die Blockread Procedure bekommt in der Funktion das Resultat der Funktion übergeben, mein Verstand reicht da nicht mehr hin.

Hier nochmal die ganze Leseroutine:
Delphi-Quellcode:
procedure TForm1.ReadFile(filename:string);
var fil: file;
        i: integer;
        num: byte; {allows up to 65535 records}
ver: byte;

   function ReadString:ShortString;
   var
   s:string;
   begin {ReadString}
     BlockRead(fil,result,1); {Read the length of the string}
     BlockRead(fil,s[1],length(s)); {Read the string itself}
   end; {ReadString}

begin {ReadFile}
   assignFile(fil,filename); reset(fil,1); {Open the file}
   BlockRead(fil,ver,sizeof(ver)); {Read the file version}
   BlockRead(fil,num,sizeof(num)); {Read the number of records}
   SetLength(VBilArray,num);
   for i:=0 to high(VBilArray) do
       with VBilArray[i] do begin    {Read the data}
         Schuldsum:=ReadString;
         Rate:=ReadString;
         RFaellig:=strtoint(ReadString);
         Abbuchungstag:=ReadString;
       end; {with}
   CloseFile(fil);
end; {ReadFile}
Kann mir jemand helfen?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Record Array speichern und lesen...Error

  Alt 11. Sep 2010, 14:07
Wenn der Record keine dynmsichen Felder besitzt, würde sich eine typisierte Datei anbieten

[Edit: Array durch Record ersetzt]
Markus Kinzler

Geändert von mkinzler (11. Sep 2010 um 14:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#3

AW: Record Array speichern und lesen...Error

  Alt 11. Sep 2010, 14:08
Zitat:
//<- s ist nirgends declariert
Ich würde stattdessen mal Result verwenden ... dort soll der Text doch wohl auch rein.

Zitat:
BlockRead(fil,result,1);
Auch wenn das so funktioniert, wäre hier Result[0] besser/verständlicher, als nur das Result ,
da an dieser Stelle auch nur dieses Feld eingelesen wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (11. Sep 2010 um 14:10 Uhr)
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#4

AW: Record Array speichern und lesen...Error

  Alt 11. Sep 2010, 14:29
Wenn der Record keine dynmsichen Felder besitzt, würde sich eine typisierte Datei anbieten

[Edit: Array durch Record ersetzt]
Hat er wohl nicht:
Delphi-Quellcode:
type
TBilanz = packed record
 Schuldsum :string[10]; //<-gesamte Schuldsumme
 Rate :string[8]; //<-Rate
 RFaellig :byte; //<-monatlich oder vierteljährlich
 Abbuchungstag:string[2]; //<-Abbuchungstag
end;

type
TBilArray = array of TBilanz;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Record Array speichern und lesen...Error

  Alt 11. Sep 2010, 14:32
Dann wäre das ja eine Option
Markus Kinzler
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#6

AW: Record Array speichern und lesen...Error

  Alt 11. Sep 2010, 14:47
Dann wäre das ja eine Option
mKinzler, ich habe hier eine Routine mit 'Writeln und Readln', die auch funktioniert. Aber es läßt mir keine Ruhe, wenn ich eine Routine finde, ausprobiere, Fehler erhalte und ich das Dingens nicht verstanden habe. Ich habe erst Ruhe, wenn die Routine ihren Zweck erfüllt.

Außerdem ist die Datei viel schlanker als wenn ich die Daten in eine 'TextFile' mit writeln schreibe.
Die Routinen sind alle hier zu finden:
http://www.delphicorner.f9.co.uk/articles/misc15.htm

Geändert von Codix32 (11. Sep 2010 um 14:50 Uhr)
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#7

AW: Record Array speichern und lesen...Error

  Alt 11. Sep 2010, 15:04
Ups, was sehen meine Äugelein?

Der Fehler ist schon in der Write Routine. Da werden die Nummer der Datei (latestFileVersion) und die Recordnummern(Number of Records->num) nicht gespeichert oder gleich mit dem Array Inhalt überschrieben. Jedenfalls felhen in der Datei die beiden Zahlen 3 für Version und 3 bzw. 2 für die Indexe:
Delphi-Quellcode:
Const
   LatestFileVersion = 3;
//......
.......
procedure TForm1.WriteFile(filename:string);
var
  fil: file;
  i: integer;
  num: byte;
const ver: byte = LatestFileVersion; //<- Const LatestFileVersion = 3; steht nicht in der Datei

    procedure WriteString(s:ShortString);
    begin
     BlockWrite(fil,s,succ(length(s)));
    end;

begin
   assignFile(fil,filename); rewrite(fil,1);
   BlockWrite(fil,ver,sizeof(ver));
   num:=length(VBilArray);
   Label8.Caption:=inttostr(num)+' '+inttostr(ver);
   BlockWrite(fil,num,sizeof(num)); //<- steht auch nicht in der MArray.txt
      for i:=0 to high(VBilArray) do
        with VBilArray[i] do begin
        WriteString(Schuldsum);
        WriteString(Rate);
        WriteString(inttostr(RFaellig));
        WriteString(Abbuchungstag);
        end;
   CloseFile(fil);
end;
//---------------------------------------------------------
procedure TForm1.Button6Click(Sender: TObject);
begin
WriteFile('MArray.txt');
end;

Geändert von Codix32 (11. Sep 2010 um 15:13 Uhr) Grund: Falsche Eingabe
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#8

AW: Record Array speichern und lesen...Error

  Alt 12. Sep 2010, 14:06
Vielen Dank mKinzler und himitsu

das Problem hat sich gelöst.

Erstens wird die Version und der Highindex in der Datei sehr wohl gespeichert, aber als hex 03 und hex 05. Mein Hexeditor hats mir verraten.

Zweitens, die in der WriteFile für den Array index stehende Variable 'num' wird in der For Schleife als High Index benutzt.
Die Funktion 'length' gibt 3 Indexe aus. Da aber das Array bei Index 0 beginnt, darf die Schleife nur von 0 bis einschlieslich 2 gehen.
Das war wohl Fehlermeldung: "EInOuterror: Versuch über das Dateiende hinauszulesen". Oder auch der EConvertError mit irgendwelchen kryptischen Zeichen ist weg.
Delphi-Quellcode:
procedure TForm1.WriteFile(filename:string);
....
...
begin {WriteFile}
   assignFile(fil,filename); rewrite(fil,1); {Create the file}
   BlockWrite(fil,ver,sizeof(ver));
   num:=length(VBilArray)-1; //<- -1 sonst ist 'num' um 1 zu hoch (num:=high(VBilArray)
   BlockWrite(fil,num,sizeof(num));
   for i:=0 to high(VBilArray) do
...
...

...
procedure TForm1.ReadFile(filename:string);
var fil: file;
        i: integer;
        num: byte; {allows up to 65535 records}
ver: byte;

   function ReadString:ShortString;
    begin {ReadString}
      BlockRead(fil,result,1); {Read the length of the string}
      BlockRead(fil,result[1],length(result)); //<-Danke Dir,himitsu
    end; {ReadString}
...
...
  SetLength(VBilArray,num);
Label7.Caption:='in ReadFile: '+'Num: '+inttostr(num)+
'HighVBilArray: '+inttostr(High(VBilArray));
   for i:=0 to num-1 do //<- num-1 sonst ERROR
...
...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:36 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