Textdateien zeilenweise einlesen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Und warum nicht gleich auf die Urmethode umsteigen?

Mit BufRead/BufWrite kann man das allemal lösen, muss halt in einem Objekt gekapselt werden. Dann braucht man nur noch zwei kleine Caches, einen in der Lese- und einen in Schreib-Routine. BufRead ermöglicht genau festzustellen wo man gerade ist, und man kann auf die nächste Position nach CR setzen. Praktisch also ein Textfile-Scanner.

Wenn Änderungen nach BufRead nicht mehr kommen, kopiert man einfach Blockweise ab der aktuellen Position von "Infile" an die aktuelle Position von "Outfile". Das geht rasend schnell und entspricht ohnehin dem, was bei Streams im Hintergrund abläuft. Beide Files müssen dabei natürlich gleichzeitig offen sein sonst gibt das dauernde Öffnen und Schließen eine Menge Overhead mit entsprechendem Zeitbedarf.

Wer's noch schicker will organisiert die Strings als Lines im Speicher mit:

Code: Alles auswählen

TTextLines = class(TObject)
  InPosition: cardinal;
  OutPositon: cardinal; // negative pos nicht möglich
  LineLen   : integer;
  Line      : string;
end;


BufWrite auf eine bestimmte Stelle im File setzt kein "eof", man kann also auch überschreiben.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Antworten