Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TFilestream immer vollständige Zeilen einlesen (https://www.delphipraxis.net/105092-tfilestream-immer-vollstaendige-zeilen-einlesen.html)

akko5 15. Dez 2007 15:13


TFilestream immer vollständige Zeilen einlesen
 
Hallo,

Ich habe eine Textdatei, in der untereinander sehr viele Wörter stehen.
Diese will ich nun Blockweise auslesen, der ausgelesene Block darf am Ende aber keine abgeschnittenen Zeilen bzw. Wörter enthalten.
(Also das letzte Zeichen des ausgelesenen Blocks sollte immer ein Zeilenumbruch sein)

Sollte doch eig. irgendwie mit dem TFileStream und der Methode Seek o.ä möglich sein oder?

Danke!

Luckie 15. Dez 2007 15:16

Re: TFilestream immer vollständige Zeilen einlesen
 
Das hatten wir gerade: [dp] zeilen zählen[/dp]. Sollte die Datei nicht zu groß sein, wäre eine Delphi-Referenz durchsuchenTStringList wohl einfachher.

akko5 15. Dez 2007 15:30

Re: TFilestream immer vollständige Zeilen einlesen
 
Ich will ja garnicht die Zeilen zählen, ich will nur, nachdem man einen Block ausgelesen hat, jedes darauf folgende Zeichen solange ausgelsen wird und zum Buffer-String hinzugefügt wird, bis ein Zeilenumbruch erreicht wird, sodass der Buffer nur vollständige Zeilen enthält, mit denen man dann weiterarbeiten kann.

Hoffe das das jmd. verstanden hat.

Luckie 15. Dez 2007 16:46

Re: TFilestream immer vollständige Zeilen einlesen
 
Das Prinzip ist doch das gleiche. Lies dir doch mal die verlinkten Beiträge durch.

Kroko1999 15. Dez 2007 17:08

Re: TFilestream immer vollständige Zeilen einlesen
 
lade die Datei in eine TStringList, werte Count und Items aus und gut ist, :wink:

himitsu 16. Dez 2007 17:19

Re: TFilestream immer vollständige Zeilen einlesen
 
In etwa so:
Delphi-Quellcode:
i := FS.Read(Buffer, BufLen);
i2 := LetztenZeilenumruchSuchen;
i3 := i - i2 - 1{oder -2 ... je nach Länge des Zeilenumbruchs ... #10 / #13#10};
Delete(Buffer, i2 + 1{oder +2}, BisEnde);
FS.Seek(-i3, soCurrent);
und so schwer ist das doch garnicht?
- einfach nachsehn wie lang die letzte Teilzeile ist
- letzte (unvollständige) Teilzeile aus'm Puffer löschen
- um soviele Bytes im Stream zurückgehn, wie diese Zeile lang war


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf