Um es dir einfach zu machen, könntest du wirklich einfach ein
Text bzw.
TextFile mit
ReadLn benutzen. Die Puffergröße kannst du mit
System.SetTextBuf vergrößern (z.B. auf 64K). Das sollte die Datenträgerzugriffe auf ein Minimum beschränken.
Ansonsten müsstest du dir wirklich jedes Zeilenende selbst suchen. Würde natürlich zur Not auch gehen, indem du direkt einen String als Puffer nimmst, also etwa so (ungetestet):
Delphi-Quellcode:
const
BUFSIZE = 65536;
// Initialisierung
function InitLine(hFile: THandle; var FileBufStr: string): boolean;
var
GotBytes: cardinal;
begin
SetLength(FileBufStr, BUFSIZE);
Result := ReadFile(hFile, @FileBufStr[1], BUFSIZE, GotBytes, nil);
if Result then
SetLength(FileBufStr, GotBytes)
else
FileBufStr := '';
end;
// Zeile lesen nach Output, liefert FALSE bei EOF, sonst TRUE
function GetLine(hFile: THandle; var FileBufStr: string; var Output: string): boolean;
var
P, OldLen: integer;
GotBytes: cardinal;
begin
P := Pos(#10, FileBufStr);
while P = 0 do
begin
OldLen := Length(FileBufStr);
SetLength(FileBufStr, OldLen + BUFSIZE);
if not ReadFile(hFile, @FileBufStr[OldLen], BUFSIZE, GotBytes, nil) then
break;
if GotBytes = 0 then
break;
SetLength(FileBufStr, OldLen + GotBytes);
P := Pos(#10, FileBufStr);
end;
if P > 0 then
begin
Result := true;
Output := Copy(FileBufStr, 1, P - 1);
Delete(FileBufStr, 1, P);
end
else
begin
Result := FileBufStr <> '';
Output := FileBufStr;
FileBufStr := '';
end;
end;