![]() |
AW: Textdatei in Record Muster überführen
Delphi-Quellcode:
Grüße
procedure TForm1.Button1Click(Sender: TObject);
var spruch, autor:string; dataSet : TSprueche; // dein Record begin nr:=random(filesize(datei)); seek(datei,nr); //*Wie kann ich nun das was er da geseeked hat als string unter spruch speichern und den autor unter autor? read(datei,dataSet); // den record aus der Datei lesen spruch:= //alles vor ; spruch := dataSet.spruch; autor:= //das nach ; autot := dataSet.autor; memo1.Lines.Add(<spruch>+'von'+<autor>) end; Klaus |
AW: Textdatei in Record Muster überführen
Danke für eure Hilfe, ich glaube ich bin jetzt sehr nah dran. Ich kann die Anwendung zumindest fehlerfrei starten. Betätige ich allerdings den Button1 erhalte ich folgende Fehlermeldung:
Projekt project1 hat Exception-Klasse >RunError(100)< ausgelöst. In Zeile 76, dies wäre hier:
Code:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type Tsprueche=record spruch:string[200]; autor:string[50]; end; { TForm1 } TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; datei: file of Tsprueche; implementation {$R *.lfm} { TForm1 } procedure txttodb(uebergabe:string); var s:Tsprueche; //variable für datei:file of Tsprueche spruch:string; //das was vorm ; steht autor:string; //das was nach ; steht posi:integer; //position im string f:textfile; //var für den textfile quelle.txt datei:file of Tsprueche; //var für den data base file ziel.db begin assignfile(f,'quelle.txt'); //Eingabe öffnen reset(f); assignfile(datei,'ziel.db'); //Ausgabe öffnen rewrite(datei); posi:=0; while not eof(f) do begin readln(f,uebergabe); //liest in f und schreibt in den string uebergabe posi:=pos(';',uebergabe); //Position von ; in uebergabe s.spruch:=copy(uebergabe,1,posi-1); //das vorm ; s.autor:=copy(uebergabe, posi+ 1, MAXINT); //nach ; write(datei,s); end; closefile(f); closefile(datei); end; procedure readRandomDataset(fileName: TFilename; var dataSet: TSprueche); var datei : file of TSprueche; idx : longInt; begin assignFile(datei,'ziel.db'); if FileExists('ziel.db') then ReSet(datei) else ReWrite(datei); idx := random(sizeOf(datei)); seek(datei,idx); read(datei,dataSet); [COLOR="Red"] closefile(datei); [/COLOR] *//Zeile 76: hier hab ich den RunError end; procedure TForm1.Button1Click(Sender: TObject); var dataSet : TSprueche; spruch, autor:string; begin readRandomDataSet('ziel.db',dataSet); spruch:= dataSet.spruch; autor:= dataSet.autor; memo1.Lines.Add(spruch+'von'+autor); end; end. |
AW: Textdatei in Record Muster überführen
Relative Pfade sind schlecht. Außerdem: was willst Du denn aus einer Datei lesen, die Du gerade erst mit Rewrite angelegt hast? Wo wird txttodb aufgerufen, und wieso hat die einen Parameter, der intern als Variable benutzt wird, statt ihn gleich als Variable zu deklarieren?
|
AW: Textdatei in Record Muster überführen
Eure Hilfe ist nochmal gefragt, da ich immernoch hier dran sitze :wink:
Aufgabenstellung hat sich insofern geändert, dass ich nun eine .txt Datei habe in der 11 Adressen in dieser Form stehen: Nachname;Vorname;PLZ;Ort;Strasse;Hausnummer;usw... Die Aufgabe an sich besteht immernoch darin die .txt datei in ein Record Muster zu überführen... Hier mein Quelltext+Fragen:
Code:
*1: recordsize=.. war eine Vorgabe, was hat 2mal +1 zu bedeuten?
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;
Code:
Beim Testen mit Ausgabe über seek() einer beliebigen Person aus der Adressdatei auf ein Memo fällt auf:
procedure person_linetorec(const Line: string; var person: Tperson);
const semi=';'; var semiPos: array [0..8] of integer; i:integer; begin FillChar(person, SizeOf(person), #0); FOR i:=0 TO 8 DO begin semiPos[i]:=Pos(semi, Line); person.nachname := Copy(Line, 0, semiPos[0]-1); person.vorname := Copy(Line, semiPos[0]+1,semiPos[1]-1); person.PLZ:= Copy(Line, semiPos[1]+1, semiPos[2]-1); //usw. - wollte erstmal testen bevor ich hier weiter tippe... end; end; - mal ist es richtig, mal falsch, je nach Länge von Nach,- und Vornamen der jeweiligen Person - erkenne aber leider keine Fehlersystematik. Hab ich bei der Copy(in,von,bis)-Sache was falsch gemacht?
Code:
Nur zum Verständnis, die prozedur macht was sie machen soll. :-D
procedure Konvertieren(const SrcFilename, DestFilename: string);
var srcfile: textfile; destfile:file of Tperson; line:string; person:Tperson; begin assignfile(srcfile,'adressen.txt'); reset(srcfile); assignfile(destfile,'adressen.db'); rewrite(destfile); while not eof(srcfile) do begin readln(srcfile,line); person_linetorec(line,person); write(destfile,person); end; closefile(destfile); closefile(srcfile); end; |
AW: Textdatei in Record Muster überführen
Besser
Delphi-Quellcode:
recordsize := SizeOf( TPerson);
|
AW: Textdatei in Record Muster überführen
Zitat:
Verlass dich nicht drauf. Du solltest dann so programmieren, das dein Programm nicht total abschmiert oder -schlimmer- total falsche Daten eingelesen werden. |
AW: Textdatei in Record Muster überführen
Zitat:
|
AW: Textdatei in Record Muster überführen
Ich halte das für einen Fehler, da für jeden String ein Längenbyte dazu addiert werden müßte.
Also für string[20] ist die Länge 20+1. Gruß K-H |
AW: Textdatei in Record Muster überführen
Zitat:
Falsch ist es, die Größe selbst ausrechnen zu wollen, denn man weiß nicht, wie Delphi die Recordfelder ausrichtet. Dies ist abhängig von den Compilereinstellungen und ob man das Record als 'packed' deklariert hat. |
AW: Textdatei in Record Muster überführen
@Furtbichler
Deine Antwort ist richtig, allerdings scheinst Du die Aussage von p80286 missverstanden zu haben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz