Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Per ReadLn() zufällige Zeile aus Textdatei lesen (https://www.delphipraxis.net/13299-per-readln-zufaellige-zeile-aus-textdatei-lesen.html)

flomei 15. Dez 2003 18:22


Per ReadLn() zufällige Zeile aus Textdatei lesen
 
Hallo!
Für nen kleines Programm zwischendurch wollte ich gerne eine zufällige Zeile aus einer Textdatei auslesen.
Ich hab die Datei so geöffnet:
Delphi-Quellcode:
AssignFile(m_namen, ParamStr(1)+'m.txt');
    {$I-}
      Reset(m_namen);
    {$I+}
    if
      IOResult <> 0
    then
      begin
        MessageDlg('Ein Fehler ist aufgetreten!'+#10#13
                  +'Vielleicht fehlt die Datei: m.txt ?!?', mtWarning, [mbOK], 0)
      end;
Nun möchte ich gerne in einer OnClick Prozedur eine zufällig ausgewählte Zeile aus dieser Datei auslesen...
Bisher bin ich soweit:
Delphi-Quellcode:
procedure TMain_Form.Btn_GenerateNameClick(Sender: TObject);
  begin
    if
      RBtn_male.Checked
    then
      vorname := ReadLn(m_namen,vorname);
  end;
Ich weiss, das ist nicht viel und leider meckert er auch noch rum und erzählt mir einen von ordinalen Typen nur komm ich nicht weiter. Ich weiss nicht wie ich das hinbekomm.
Wär nett, wenn einer von euch helfen könnte...

Danke im Vorraus!

MfG Florian :hi:

jbg 15. Dez 2003 18:24

Re: Per ReadLn() zufällige Zeile aus Textdatei lesen
 
Zitat:

vorname := ReadLn(m_namen,vorname);
ReadLn ist eine Prozedur und hat somit keine direkten Rückgabewert. Die Zuweisung ist also falsch.

Zudem kannst du mit ReadLn schlecht querfeldein in der Datei lesen.

flomei 15. Dez 2003 18:29

Re: Per ReadLn() zufällige Zeile aus Textdatei lesen
 
Thx! Geht schon besser.
Nun geht er aber von vorne nach hinten durch die Datei aber ich möchte ja gerne kreuz und quer durchgehen.
Kann man das nicht irgendwie arrangieren? Vielleicht per Random eine Zeile auswählen und die auslesen?

MfG Florian :hi:

stb 15. Dez 2003 18:31

Re: Per ReadLn() zufällige Zeile aus Textdatei lesen
 
mit seek(...RND..) ?
stb

flomei 15. Dez 2003 18:34

Re: Per ReadLn() zufällige Zeile aus Textdatei lesen
 
^^ Wie benutzt man das? Aus der OH werd ich irgendwie nicht schlau... :(

MfG Florian :hi:

jbg 15. Dez 2003 18:44

Re: Per ReadLn() zufällige Zeile aus Textdatei lesen
 
Zitat:

Zitat von flomei
Wie benutzt man das?

Gar nicht, da es nur mit file / file of Datentyp funktioniert, aber nicht mit TextFile.

Mein Vorschlag ist die Datei mit Hilfe einer TStringList einzulesen und dann auf die Zeilen per Index zuzugreifen.
Delphi-Quellcode:
var
  Lines: TStrings;
  Index: Integer;
begin
  Lines := TStringList.Create;
  try
    // Datei "$(EXE-PFAD)\MeineDatei.txt" einlesen
    Lines.LoadFromFile(ExtractFileDir(ParamStr(0)) + '\MeineDatei.txt');
    if Lines.Count = 0 then
      raise Exception.Create('Die Datei ist leer.');

    Index := Random(Lines.Count); // Zufallszahl ermitteln aus [0, Count - 1]
    ShowMessage(Lines[Index]);

  finally
    Lines.Free;
  end;
end;

flomei 15. Dez 2003 19:34

Re: Per ReadLn() zufällige Zeile aus Textdatei lesen
 
Seltsam...
Ich habe zwei TXT´s mit Namen...

1. Bei den weiblichen Namen klappt fast alles. Da fehlt immer der erste Buchstabe. <-- Warum?
2. Bei den männlichen wird immer nur ein einziger Namen, der erste in der der Datei, angezeigt. <-- Warum?

Danke im Vorraus!

MfG Florian :hi:

[EDIT] Ich habe folgenden Code und anscheinend werden bei den weiblichen auch immer nur die mit A am Anfang angezeigt...
Delphi-Quellcode:
procedure TMain_Form.OpenFiles(Sender: TObject);
  begin

{ Es folgt das Öffnen der Textdateien in denen die Namen stehen...
  Wenn die Dateien leer sein sollten erscheint eine Warnmeldung... }

//Männer Namen
  begin
    m_namen := TStringList.Create;
    m_namen.LoadFromFile(ExtractFileDir(ParamStr(0)) + '\m.txt');
    if
      m_namen.Count = 0
    then
    raise Exception.Create('Die Datei ist leer.');
    anzahl_m := Random(m_namen.Count);
  end;

//Frauen Namen
  begin
    w_namen := TStringList.Create;
    w_namen.LoadFromFile(ExtractFileDir(ParamStr(0)) + '\w.txt');
    if
      w_namen.Count = 0
    then
    raise Exception.Create('Die Datei ist leer.');
    anzahl_w := Random(w_namen.Count);
  end;

//Nachnamen
  begin
    nach_namen := TStringList.Create;
    nach_namen.LoadFromFile(ExtractFileDir(ParamStr(0)) + '\nach.txt');
    if
      nach_namen.Count = 0
    then
    raise Exception.Create('Die Datei ist leer.');
    anzahl_nach := Random(nach_namen.Count);
  end;

end;
und dann der "Aufruf":
Delphi-Quellcode:
procedure TMain_Form.Btn_GenerateNameClick(Sender: TObject);
  begin
      if
        RBtn_male.Checked
      then
        begin
          vorname := m_namen.ValueFromIndex[Random(anzahl_m)];
          Edt_Name.Text := vorname
        end
      else
        begin
          vorname := w_namen.ValueFromIndex[Random(anzahl_w)];
          Edt_Name.Text := vorname
        end
  end;
Die Nachnamen habe ich erst mal rausgelassen... [/EDIT]

devnull 15. Dez 2003 19:41

Re: Per ReadLn() zufällige Zeile aus Textdatei lesen
 
hi,
du könntest doch auch einfach (wenn du keine liste erzeugen willst) die datei öffnen, und dann dir mit random eine zeilenzahl kreieren lassen.

Delphi-Quellcode:
  assignfile ();
  [..]
  zeilenzahl := random (max_zeilenzahl);
  // schleife liest zeile für zeile
  for i := 1 to zeilenzahl-1 do readln (t);
  // wenn i = zeilenzahl, wird die zeile eingelesen, tataa
  readln (t,zeile);
  closefile (t);
vll hilft ja das

devnull

flomei 15. Dez 2003 19:51

Re: Per ReadLn() zufällige Zeile aus Textdatei lesen
 
Aber dann kann ich einer Variable doch immer noch nicht ReadLn() zuweisen oder?

MfG Florian :hi:

P.S.: Ich geh jetzt erst mal die Experten im Borland Chat fragen... ;)

Jelly 15. Dez 2003 19:52

Re: Per ReadLn() zufällige Zeile aus Textdatei lesen
 
Hi Devnull,

Zitat:

Zitat von devnull
Delphi-Quellcode:
zeilenzahl := random (max_zeilenzahl);

Wo dann das Problem, wie du max_zeilenzahl ermitteln willst, ohne vorher alles in den Speicher zu lesen oder sonstwie die CR zu zählen. Deshalb würd ich auch die Datei mittels einer TStringlist komplett einlesen und anschliessend mit StringList[random(Stringlist.count)] in eine Zeile springen.

Gruss,
Tom


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 Uhr.
Seite 1 von 2  1 2      

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