Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Textdatei in Record Muster überführen (https://www.delphipraxis.net/172584-textdatei-record-muster-ueberfuehren.html)

p80286 20. Jan 2013 12:28

AW: Textdatei in Record Muster überführen
 
Zitat:

Zitat von mabstudent (Beitrag 1199755)
Hier mein Quelltext+Fragen:

Code:
const
  recordsize=1+20+20+5+20+30+3+4+9+1; //[B]*1[/B]
type
  Tperson=record
    Nachname:string[20];
    Vorname:string[20];
    PLZ:string[5];
    Ort:string[20];
    Strasse:string[30];
    Hausnummer:string[3];
    Vorwahl:string[4];
    Telefon:string[9];
  end;
*1: recordsize=.. war eine Vorgabe, was hat 2mal +1 zu bedeuten?

recordsize soll die Größe von TPerson liefern, darum zweimal +1 für das Längenbyte. Damit es richig ist müßte in diesem Beispiel für jeden String einmal +1 eingefügt werden.

Wobei die "Packed"-Falle natürlich nicht beachtet wird. Ebenso ist es besser gleich mit
Delphi-Quellcode:
Sizeof
zu arbeiten.

Wenn mit den gemachten Vorgaben, das Programm wirklich funktioniert, dann ist das reines Glück!

Gruß
K-H

mabstudent 21. Jan 2013 13:14

AW: Textdatei in Record Muster überführen
 
Danke, verstanden.

Aber das Programm läuft immernoch nicht. Sieht jemand einen Fehler?
Ich möchte aus der erstellten record datei einen bestimmten record auslesen - mehr eigentlich nicht :?
Muss ich an die Datei vom Typ Tperson 'recadressen.??' eine Endung hängen?? Wenn ja, was??
Ich bekomme keinen Fehler, aber auch keinen Inhalt im Memo. ABER die Warnung, dass person nicht initialisiert wurde in Zeile (siehe Code).

Aktueller Code:
Code:
[...]

type
  Tperson=record
  nachname:string[20];
  vorname:string[10];
  plz:string[5];
  ort:string[20];
  strasse:string[20];
  hausnummer:string[5];
  vorwahl:string[5];
  telefon:string[10];
  end;

[...]

 const
   recordsize = sizeof(Tperson);
var
  Form1: TForm1;

[...]

function linetorec(var s:string):Tperson; //hier sollen später wenn person.nachname funktioniert die weiteren
const                                    //Eigenschaften von Tperson zugewiesen werden, d.h.
  semi = ';';                            //ich will den string bis zum ersten semikolon löschen und wieder
var                                      //über pos nach dem neuen ersten semikolon suchen, dann wieder
  semiPos: integer;                      //löschen usw.
  person: Tperson;

begin
  semiPos:=0;
  semiPos:=Pos(semi, s);
  person.nachname:= copy(s, 0, semiPos -1);
  result:=person;
end;



procedure TForm1.Button1Click(Sender: TObject);  //Konvertieren: inhalt textfile an record datei übergeben
                                             
var srcfile: textfile;
    destfile: file of Tperson;
    line: string;
    person: Tperson;
begin
  assignfile(srcfile,'adressen.txt');     //Quelle öffnen
  reset(srcfile);
  assignfile(destfile,'recadressen.dat'); //Ziel öffnen
  rewrite(destfile);
  memo1.clear;
  while not eof(srcfile) do
  begin
    repeat readln(srcfile, line)          //Zeile lesen
    until line <> '';                     //bis irgendwas in line drin ist
    linetorec(line);                      //aus der Zeile, person(Tperson) machen
                 
    write(destfile, person);              //die Zieldatei (record) beschreiben.*Warning: Local var person does
                                           //not seem to be initialized.
  end;
  closefile(destfile);
  closefile(srcfile);

end;

procedure TForm1.Button2Click(Sender: TObject); //destfile lesen + ins memo

var
    rec_pos: integer;
    anz_recs: integer;
    person: Tperson;
    destfile: file of Tperson;
begin
  rec_pos:=strtoint(edit1.text);                       //gewünschte Person aus Edit1 lesen
  anz_recs:=filesize('recadressen') div recordsize;    //grenzt die Eingabemögl. für Edit1 ein von 0..anz_recs
  label1.caption:=inttostr(anz_recs);
  assignfile(destfile, 'recadressen');                 //record Datei öffnen
  reset(destfile);
  seek(destfile, rec_pos);                             //an die gewünschte Stelle fahren und
  read(destfile, person);                              //Person x auslesen
  memo1.clear;
  memo1.lines.add(person.nachname+...);                //hier folgen später die weiteren Eigenschaften
  closefile(destfile);



end;

end.

Klaus01 21. Jan 2013 13:19

AW: Textdatei in Record Muster überführen
 
nun, wenn du die Datei unter einem bestimmten Namen speicherst (recadressen.dat)
solltest Du sie auch wieder unter dem gleichen öffnen.

Ich würde an Deiner Stelle beim Abspeichern und Laden den Pfad mit angeben.

Edit1:
Delphi-Quellcode:
 anz_recs:=filesize('recadressen') div recordsize;
ist meines Erachtens falsch.

Bei typisierten Dateien gibt fileSize die Anzahl der Datensätze zurück und die die Dateigröße in Byte.

Grüße
Klaus

mabstudent 21. Jan 2013 13:41

AW: Textdatei in Record Muster überführen
 
Ganze Pfade eingeben klappt leider auch nicht.

Gebe ich filesize('recadressen') auf ein Label aus erhalte ich 1133.= das entspricht der Größe in byte
Gebe ich recordsize auf ein Label aus erhalte ich 103. = alle Stringlängen(20+10+5+20+20+5+5+10=95) + Anzahl Eigenschaften von Tperson(das sind 8)--> 95+8=103.

filesize() div recordsize also 11.

Ich habe 11 Personen in meiner Datei stehen. Kommt also zumindest hin.

Bedeutet das, dass meine Datei recadressen nicht richtig typisiert wurde?

Klaus01 21. Jan 2013 13:48

AW: Textdatei in Record Muster überführen
 
aus der Delphi Hilfe:

Zitat:

In Delphi code, call FileSize to determine the size of the file specified by the file variable F. The size is expressed as the number of records in a record file. Thus:

If the file is declared as a file of byte, then the record size defaults to one byte, and FileSize returns the number of bytes in the file.
The Reset procedure can set the record size (in bytes) when it opens the file. In this case, FileSize returns the number of records in the file.
Note: If the file is declared as an untyped file and you do not specify a record size when you call Reset, then FileSize assumes a record size of 128. That is, FileSize gives the number of bytes divided by 128.
To use FileSize, the file must be open. If the file is empty, FileSize(F) returns 0.
Delphi-Quellcode:
  rec_pos:=strtoint(edit1.text);                      //gewünschte Person aus Edit1 lesen
für Edit1 ein von 0..anz_recs
  assignfile(destfile, 'recadressen');                //record Datei öffnen
  reset(destfile);

  anz_recs:=filesize(destFile);   //grenzt die Eingabemögl.
  label1.caption:=inttostr(anz_recs);

  seek(destfile, rec_pos);                            //an die gewünschte Stelle fahren und
  read(destfile, person);                             //Person x auslesen
  memo1.clear;
  memo1.lines.add(person.nachname+...);               //hier folgen später die weiteren Eigenschaften
  closefile(destfile);
Grüße
Klaus

mabstudent 21. Jan 2013 14:28

AW: Textdatei in Record Muster überführen
 
das hieße ja meine angebliche record datei wurde nicht so wirklich typisiert, oder? Aber was ist der Grund?

Klaus01 21. Jan 2013 14:32

AW: Textdatei in Record Muster überführen
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject); //Konvertieren: inhalt textfile an record datei übergeben
                                             
var srcfile: textfile;
    destfile: file of Tperson;
    line: string;
    person: Tperson;
begin
  assignfile(srcfile,'adressen.txt');    //Quelle öffnen
  reset(srcfile);
  assignfile(destfile,'recadressen.dat'); //Ziel öffnen
  rewrite(destfile);
  memo1.clear;
  while not eof(srcfile) do
  begin
    repeat readln(srcfile, line)         //Zeile lesen
    until line <> '';                    //bis irgendwas in line drin ist
    //linetorec(line);                     //lineToRec ist eine Funktion mit dem Rückgabewert TPerson

    person := lineToRec(line);            
    write(destfile, person);             //die Zieldatei (record)
beschreiben.*Warning: Local var person does
                                           //not seem to be initialized.
   // oder write(destFile,lineToRec(line));
  end;
  closefile(destfile);
  closefile(srcfile);

end;
Grüße
Klaus

mabstudent 21. Jan 2013 14:37

AW: Textdatei in Record Muster überführen
 
Vielen vielen Dank. :-D
Das war der Haken, hatte irgendwie an Prozeduren gedacht!


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:36 Uhr.
Seite 3 von 3     123   

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