Hallo,
Vielen Dank für die Tips.
Ich habe mir die
Unit File64 angeschaut, aber leider funktionieren dort die Positionszeiger nicht so ganz sauber wie ich mir das vorstelle. Daher möchte ich das lieber auf 32 bit realisieren.
Anbei mein Code, der eine Datei durchforstet und jeweils bei CrLf eine neue Zeile ausgibt. (Siehe Ausgabe).
Ich habe trotzdem das Gefühl dass das nicht sonderlich Performant (vermutlich zuviele Variablenzuweisungen) ist, bzw. teilweise sogar nicht sauber funktioniert. (wenn Startposition und Endposition nicht die gesamte Datei beinhalten).
Prinzipiell arbeitet der Code so, dass der den Buffer dessen größe in MAXLINELENGTH festgelegt wird in eine Variable ließt und untersucht. Der Rest nach dem Zeilenumbruch wird dann in die Variable Linebuffer übernommen und die Abarbeitung beginnt von neuem.
Habt jemand von euch noch einen optimierungs Tip? Ich wäre sehr dankbar.
Delphi-Quellcode:
const
MAXLINELENGTH = 128;
FileName = 'c:\in.file';
var
curr, feof, readlen, tmppos: Longint;
startpos, Stoppos: Longint;
Buffer : array [0..MAXLINELENGTH] of char;
p : PChar;
f : integer;
Line : string;
LineBuffer : string;
text : string;
begin
f := FileOpen (FileName, 0);
feof := FileSeek (f, 0, 2);
// feof = Größe der Datei (wo das Lesen
Startpos := 0;
// Startpos setzt den Dateizeiger dorthin wo das Einlesen begonnen werden soll
Stoppos := feof;
// Wir wollen jetzt mal exemplarisch die gesammte Datei bearbeiten...
FileSeek (f, 0, 0);
// Dateizeiger an den Anfang der Datei
curr := FileSeek (f, 0, 1);
// Aktuelle Position in curr einlesen
LineBuffer := '';
while (curr < stoppos do
begin
if ((curr + MAXLINELENGTH )> stoppos then
begin
readlen := stoppos- curr;
end
else
begin
readlen := MAXLINELENGTH;
end;
FileRead(f, Buffer, readlen);
p := StrScan (Buffer, #10);
if p = Nil then
begin
if (StrScan (Buffer, #13) = Nil) then
begin
Line := Copy(Buffer,0,MAXLINELENGTH);
end
else
begin
Line := Copy(Buffer,0,MAXLINELENGTH-1);
end;
LineBuffer := LineBuffer + Line;
end
else
begin
Line := Copy(Buffer,0,(p-@Buffer-1));
text := LineBuffer + Line;
LineBuffer := '';
FileSeek (f, 0-readlen+(p-@Buffer)+1, 1);
Memo1.Lines.Add(text);
// Exemplarische Ausgabe
end;
curr := FileSeek(f, 0, 1);
end;
FileClose (f);
end;