AGB  ·  Datenschutz  ·  Impressum  







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

Textdatei in Record Muster überführen

Ein Thema von mabstudent · begonnen am 12. Jan 2013 · letzter Beitrag vom 21. Jan 2013
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#21

AW: Textdatei in Record Muster überführen

  Alt 20. Jan 2013, 13:28
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 Sizeof zu arbeiten.

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

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
mabstudent

Registriert seit: 13. Nov 2010
23 Beiträge
 
#22

AW: Textdatei in Record Muster überführen

  Alt 21. Jan 2013, 14:14
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.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#23

AW: Textdatei in Record Muster überführen

  Alt 21. Jan 2013, 14:19
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:
 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
Klaus
  Mit Zitat antworten Zitat
mabstudent

Registriert seit: 13. Nov 2010
23 Beiträge
 
#24

AW: Textdatei in Record Muster überführen

  Alt 21. Jan 2013, 14:41
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?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#25

AW: Textdatei in Record Muster überführen

  Alt 21. Jan 2013, 14:48
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
Klaus
  Mit Zitat antworten Zitat
mabstudent

Registriert seit: 13. Nov 2010
23 Beiträge
 
#26

AW: Textdatei in Record Muster überführen

  Alt 21. Jan 2013, 15:28
das hieße ja meine angebliche record datei wurde nicht so wirklich typisiert, oder? Aber was ist der Grund?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#27

AW: Textdatei in Record Muster überführen

  Alt 21. Jan 2013, 15:32
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
Klaus
  Mit Zitat antworten Zitat
mabstudent

Registriert seit: 13. Nov 2010
23 Beiträge
 
#28

AW: Textdatei in Record Muster überführen

  Alt 21. Jan 2013, 15:37
Vielen vielen Dank.
Das war der Haken, hatte irgendwie an Prozeduren gedacht!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 04:58 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