Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ReadLn - Welche Zeile? (https://www.delphipraxis.net/32635-readln-welche-zeile.html)

StanY 26. Okt 2004 14:27


ReadLn - Welche Zeile?
 
Mh, ich will ganz simpel eine bestimmte Zeiler einer Textdatei auslesen.

Allerdings habe ich das Problem, dass ich es, trotz Suchfunktion, nicht schaffe, herauszubekommen, woher Delphi die Zeile weiß, die ich auslesen will.

Mit Reset setze ich ja den Curson bzw. den Zeiger an den Anfang, aber wie setze ich ihn auf den Anfang der z.B. 2ten Zeile?

ste_ett 26. Okt 2004 14:29

Re: ReadLn - Welche Zeile?
 
s. Delphi Hilfe :)

Zitat:

Beschreibung

In Delphi liest ReadLn eine Textzeile aus der angegebenen Datei und setzt den Dateizeiger in die nächste Zeile.

StanY 26. Okt 2004 14:30

Re: ReadLn - Welche Zeile?
 
Joa, da kann ich 1 auslesen, dann 2, dann 3 etc.

Nur was, wenn ich NUR die zweite Zeile auslesen will? oO

Dax 26. Okt 2004 14:30

Re: ReadLn - Welche Zeile?
 
Du kannst nicht einfach so einen Dateicursor versetzten, du musst schon Read oder ReadLn aufrufen. Diese Funktionen setzen dann den Dateicursor woanders hin.

StanY 26. Okt 2004 14:32

Re: ReadLn - Welche Zeile?
 
Toll.

Und wie komme ich _nur_ an die zweite Zeile ran?

Von mir aus auch mit anderen Methoden als ReadLn... wenn das anscheind nicht geht \:

Das muss doch möglich sein.

edit: btw. wenn die Funktion den Cursor setzen kann, dann kann ich das ja auch irgendwie ^^

Dax 26. Okt 2004 14:33

Re: ReadLn - Welche Zeile?
 
Zweite Zeile?
Delphi-Quellcode:
ReadLn(InFile);
ReadLn(Infile, Buffer);

StanY 26. Okt 2004 14:37

Re: ReadLn - Welche Zeile?
 
Zweite Zeile war nur ein Beispiel. Was wenn ich an die 5326467423543 Zeile ran will.

Ist dann:

Delphi-Quellcode:
for i := 0 to 5326467423542 do begin
  ReadLn(F);
end;
ReadLn(F,BUffer);
auch noch möglich bzw resourcen sparend?

Dax 26. Okt 2004 14:41

Re: ReadLn - Welche Zeile?
 
Da ReadLn in diesem Fall nichts einliest, sondern nur den Dateicursor verschiebt, geht das und verbraucht (ausser Prozessorzeit) kaum Resourcen.Die einzig andere Möglichkeit, dies Akzeptabel zu lösen wäre mit Streams.

Alex_ITA01 26. Okt 2004 14:48

Re: ReadLn - Welche Zeile?
 
meiner Meinung nach geht das mit Seek()...
guck mal in die Delphi-Hilfe.Da steht alles drinne

Delphi-Hilfe-Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
   f: file of Byte;
   size: Longint;
   S: string;
   y: Integer;
begin
  if OpenDialog1.Execute then
  begin
    AssignFile(f, OpenDialog1.FileName);
    Reset(f);
    try
      size := FileSize(f);
      S := 'File size in bytes: ' + IntToStr(size);
      y := 10;
      Canvas.TextOut(5, y, S);
      y := y + Canvas.TextHeight(S) + 5;
      S := 'Seeking halfway into file...';
      Canvas.TextOut(5, y, S);

      y := y + Canvas.TextHeight(S) + 5;
      Seek(f, size div 2);
      S := 'Position is now ' + IntToStr(FilePos(f));
      Canvas.TextOut(5, y, S);
    finally
      CloseFile(f);
    end;
  end;
end;
MFg Alex

Luckie 26. Okt 2004 15:03

Re: ReadLn - Welche Zeile?
 
Ich werfe mal die StringListe hier in die Runde. ;)

StanY 26. Okt 2004 16:10

Re: ReadLn - Welche Zeile?
 
Aber Stringlist beinhaltet ja, dass ich die Datei in den RAM laden muss.
Da das Programm aber evtl. wenns fertig ist auf 'schlechteren' rechnern läuft und die .txt-Datei recht groß werden kann, will ich das eigentlich vermeiden.

Die Stream-Geschichte werde ich mir mal anschaun, darum habe ich bislang immer einern Bogen gemacht (;.

Und danke auf wg. Seek() auch das schau ich mir mal an, wenn ich wieder an meinem Rechner bin.

Pseudemys Nelsoni 26. Okt 2004 16:14

Re: ReadLn - Welche Zeile?
 
seek ist schon das was du willst. ...wundert mich überhaupt das das hier erst am ende erwähnt wurde.

himitsu 26. Okt 2004 16:17

Re: ReadLn - Welche Zeile?
 
Seek() ist zwar das richtige, aber dafür muß man dennoch erst den Anfang der Datei auslesen und für die 2. Zeile das Zeichen, nach dem 1. Zeilenumbruch suchen,

also ist der 1. Vorschlag vom Dax besser.

Delphi-Quellcode:
ReadLn(InFile);
ReadLn(Infile, Buffer);

Pseudemys Nelsoni 26. Okt 2004 16:20

Re: ReadLn - Welche Zeile?
 
Zitat:

Seek() ist zwar das richtige, aber dafür muß man dennoch erst den Anfang der Datei auslesen
Seitwann das? ich benutze immer direkt Seek() ohne vorher readln benutzt zu haben und es ging immer.

Reset() setzt den zeiger an die erste position, also readln() brauch man nicht

Strophi 26. Okt 2004 16:39

Re: ReadLn - Welche Zeile?
 
Hi,

wenn Du Text zufälligerweise selber generierst, oder er sich nicht oft ändert, erzeuge doch ein Index-File, indem Du das File einmal durchrödelst und Dir vor jedem readln die aktuelle Position im File merkst, und diese in ein Array oder woanders speicherst. Dann kannst Du dir aus dem Array die benötigte Position holen, diese seeken und auslesen.

mit freundlichen Grüßen

Strophi

himitsu 26. Okt 2004 16:40

Re: ReadLn - Welche Zeile?
 
Ja und woher willst du die Position wissen, zu der du mit Seek springen mußt, damit du z.B. die 2. Zeile triffst?
@Pseudemys Nelsoni

StanY 26. Okt 2004 16:47

Re: ReadLn - Welche Zeile?
 
Ich denke ich bleibe bei ReadLn und einer Schleife, da ich bei Seek und auch bei Streams anscheind das Problem ist, dass ich die Datei lediglich Byte- und nicht Zeilenweise auslesen kann.

Die Index-Datei wäre zwar eine nette Idee, allerdings lohnt es sich wohl nicht, da der Aufwand zu groß ist und es eigentlich kaum mehr bringt als ReadLn.

StringList scheidet ja schon wg. des Rams aus.

Fazit: Wie schon gesagt: ReadLn. Oder liege ich mit dem, was ich Verstanden habe irgendwie falsch? (Achtung, sobald die Antwort nein ist, ist dies eine rethorische Frage, um Spam zu vermeiden (; )

roderich 26. Okt 2004 17:35

Re: ReadLn - Welche Zeile?
 
Seek geht nicht bei Text-Dateien.

Die StringList ist natürlich prinzipiell die erste Wahl, aber wie gesagt wenn die Datei zu groß ist.....

Die Idee mit den Streams hat was für sich: blockweise einlesen, eine Intelligenz einbauen, die nach Zeilenumbrüchen sucht/zählt. Aber wie gesagt, warum dann nicht gleich x ReadLn-Aufrufe ?!?

Roderich


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 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-2025 by Thomas Breitkreuz