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 1 von 3  1 23      
mabstudent

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

Textdatei in Record Muster überführen

  Alt 12. Jan 2013, 12:53
Delphi-Version: 5
Hallo zusammen, ich habe folgendes Problem:

Vorweg, worum gehts: Programm soll auf Knopfdruck einen per Zufall ermittelten Spruch aussuchen und in ein Memofeld schreiben. Die Sprüche sind in einer Textdatei, aufgebaut aus (spruch;autor<nächste Zeile>spruch;autor<nächste Zeile> usw.). Das Programm soll den Spruch aus der Recorddatei holen, die zuvor erzeugt wird und in das Memofeld schreiben. Erstmal der Ansatz:

Delphi-Quellcode:
type Tsprueche=record
spruch:string[200];
autor:string[50];
end;

procedure speichern(hilfe:string);
var s:Tsprueche; s1:string; posi:integer;
    f:textfile; //hier stehen ca. 20 Sprüche, Weisheiten, etc. drin
    datei:file of Tsprueche; //record vom Textfile
begin
assignfile(f,'C:\...'+'spruch.txt');
reset(f);
AssignFile(datei,'C:\...'+'sprueche.dat');
  IF fileexists('C:\...'+'sprueche.dat') THEN
  Reset(datei) ELSE Rewrite(datei);
posi:=0;
while not eof(f) do
  begin
  readln(f,hilfe);
  posi:=pos(';',hilfe);
  s1:=copy(hilfe,1,posi-1);
  case posi of
  0: s.spruch:=s1;
  1: s.autor:=s1;
  end;
  write(datei,s);
  end;
closefile(f);
closefile(datei);
Anschließend soll unter Button1Click folgendes passieren:

1. per Zufall einen der Sprüche ermitteln, die ja jetzt im record Muster vorhanden sind, also über seek(datei, nr des zufallsspruchs) angesprochen werden können

2. Spruch ins Memo schreiben (<spruch> +'von'+ <autor>)

Hier bekomme ich enorm Probleme mit den Typen der einzelnen Variablen und der Übernahme aus der anderen Prozedur. Kann mir an der Stelle jemand helfen?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Textdatei in Record Muster überführen

  Alt 12. Jan 2013, 13:00
Ist das mit der typisierten Datei und dem Record eine Vorgabe, oder darfst Du das auch anders lösen? IMO ginge das z.B. mit einer T(Mem)IniFile bedeutend einfacher. Ansonsten sieht mir die case-Abfrage etwas sonderbar aus, was ist denn, wenn ";" gar nicht im String vorkommt? Möglicherweise habe ich den Code aber auch nur zu schnell überflogen und daher die Logik nicht begriffen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Klaus01

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

AW: Textdatei in Record Muster überführen

  Alt 12. Jan 2013, 13:04
Hallo,

musst Du die TextDatei so einlesen?

Einfacher ginge es mit einer TStringList und dem entsprechenden Delimiter.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
mabstudent

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

AW: Textdatei in Record Muster überführen

  Alt 12. Jan 2013, 13:08
Zitat:
Ist das mit der typisierten Datei und dem Record eine Vorgabe, oder darfst Du das auch anders lösen?
Zitat:
musst Du die TextDatei so einlesen?
Leider schreibe ich das Programm nicht für mich, sondern es ist eine vorgegebene Aufgabe, wo der Umgang mit Records gelernt werden soll. Hab auch schon gedacht, dass es ja anders viel einfacher ginge. Muss es leider genau so machen.

Zitat:
was ist denn, wenn ";" gar nicht im String vorkommt?
Also das in der Textdatei zwischen spruch und autor immer ein semikolon steht weiß ich ganz sicher.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Textdatei in Record Muster überführen

  Alt 12. Jan 2013, 13:12
Dann teil doch das Gesamtproblem einmal in Teilprobleme auf und schreib die schön einzeln als Funktionen bzw. Prozeduren. Eine ordentliche Einrückung hilft beim Code-Verständnis übrigens ungemein, Du solltest darauf achten.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Klaus01

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

AW: Textdatei in Record Muster überführen

  Alt 12. Jan 2013, 13:23
.. auslesen könnte so gehen..

Delphi-Quellcode:
procedure readRandomDataset(fileName: TFilename; var dataSet: TSprueche);
var
  dataFile : file of TSprueche;
  idx : longInt;
begin
  assignFile(dataFile,fileName);
  reset(dataFile); //Datei öffnen, Dateizeiger auf Pos. 0
  idx := random(sizeOf(dataFile)); // ermitteln eines zufälligen Datensatzes/Records
  seek(dataFile,idx); // setze Dateizeiger auf den zufälligen Datensatz
  read(dataFile,dataSet); // lese Datensatz/Record
  closeFile(dataFile); // Datei schliessen
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  dataSet : TSprueche;
begin
  readRandomDataSet('...',dataSet);
  memo1.Lines.Add(format('%s von %s',[dataSet.author,dataSet.textValue]));
end;
Einbauen könnte man noch eine gescheite Fehlerbehandlung.

Grüße
Klaus
Klaus

Geändert von Klaus01 (13. Jan 2013 um 09:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Textdatei in Record Muster überführen

  Alt 12. Jan 2013, 13:29
Und hier noch ein Grobkonzept zur Konvertierung:
Delphi-Quellcode:
type
  Tsprueche=record
    spruch:string[200];
    autor:string[50];
  end;
  
procedure StringToSpruch(const Line: string; var Spruch: TSprueche);
const
  DELIM = ';';
var
  DelimPos: integer;
begin
  FillChar(Spruch, SizeOf(Spruch), #0);
  DelimPos := Pos(DELIM, Line);
  Spruch.autor := Copy(Line, 1, DelimPos - 1);
  Spruch.spruch := Copy(Line, DelimPos + 1, MAXINT);
end;
  
procedure Konvertieren(const SrcFilename, DestFilename: string);
var
  Spruch: Tsprueche;
  Zeile: string;
  Eingabe: textfile;
  Ausgabe: file of Tsprueche;
begin
  (* Eingabe öffnen *)
  (* Ausgabe öffnen *)
  (* Schleife *)
    (* Zeile aus Eingabe lesen *)
    StringToSpruch(Zeile, Spruch);
    (* Spruch in Ausgabe schreiben *)
  (* Ende Schleife *)
  (* Ausgabe schließen *)
  (* Eingabe schließen *)
end;
Ungetestet, da im Editor heruntergetippt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mabstudent

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

AW: Textdatei in Record Muster überführen

  Alt 12. Jan 2013, 14:38
puh da ist zu viel bei wovon ich noch nie etwas gehört habe. Probiere gerade eure Tips so umzusetzen, dass ich nur das nutze was wir auch bisher an Werkzeug an die Hand bekommen haben, leider erfolglos.

Teilprobleme sind meiner Meinung nach:

1. Recorddatei 'sprueche.db' erzeugen (klappt noch)

Code:
type Tsprueche=record
spruch:string[200];
autor:string[50];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AssignFile(datei,'C:\...\'+'sprueche.dat');
  IF fileexists('C:\...\'+'sprueche.dat') THEN
  Reset(datei) ELSE Rewrite(datei);
end;

2. Die Sprüche aus der sprüche.txt Textdatei in die record datei namens datei schreiben, dabei nach spruch und autor trennen




3.Button1Click, also zufälligen Spruch ins Memo schreiben

Code:
procedure TForm1.Button1Click(Sender: TObject);
var spruch, autor:string;
 
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?
  spruch:= //alles vor ;
  autor:= //das nach ;
  memo1.Lines.Add(<spruch>+'von'+<autor>)
end;
Ich wäre für jeden weiteren Tipp sehr dankbar, dennoch habe ich die bereits vorhandenen Tipps auch noch nicht 100% durchschaut, daran arbeite ich gerade

Geändert von mabstudent (12. Jan 2013 um 14:50 Uhr)
  Mit Zitat antworten Zitat
mabstudent

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

AW: Textdatei in Record Muster überführen

  Alt 12. Jan 2013, 15:16
Zitat:
procedure Konvertieren(const SrcFilename, DestFilename: string);
var
Spruch: Tsprueche;
Zeile: string;
Eingabe: textfile;
Ausgabe: file of Tsprueche;
begin
(* Eingabe öffnen *)
(* Ausgabe öffnen *)
(* Schleife *)
(* Zeile aus Eingabe lesen *)
StringToSpruch(Zeile, Spruch);
(* Spruch in Ausgabe schreiben *) *//Könntest du den Teil konkretisieren?
(* Ende Schleife *)
(* Ausgabe schließen *)
(* Eingabe schließen *)
end;
Muss es heißen:

write(dateivariable,von, bis) oder write(dateivariable, was) ??
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Textdatei in Record Muster überführen

  Alt 12. Jan 2013, 15:20
Da steht Schleife, d.h. Du befindest Dich an der Stelle innerhalb einer solchen. Hier wurde die aktuell ausgelesene Zeile aus der Textdatei in den übergebenen Record geschrieben, es muss also heißen
write(Ausgabe, Spruch); wobei Ausgabe die Dateivariable der typisierten Datei und Spruch die Variable vom Typ des Records ist.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 22:59 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