{Programmfragment liest Textdatei, egal ob UNIX- oder DOS-Format;
allerdings hier noch Abbruch bei 1A (^Z) und nicht bei 04 (^D).
BP7 schneidet zu lange Zeilen einfach ab; d.h. der Zeilenrest geht
verloren und wird nicht etwa als nchster String bei ReadLn() geliefert.
Dieses Programm sollte auch mit Delphi 1 und (eigentlich auch) Delphi 2
funktionieren, da ohne Assembler-Anweisungen}
uses Dos;
var
S: String;
f: Text;
OldInOut: function(var f: TextRec):Integer;
{So sind diese TextRec-Funktionen definiert; Rckgabe=DOS-Fehlercode}
function NewInOut(var f: TextRec):Integer; far;
var
n: Integer; {Laufindex}
begin
{ WriteLn('Hier');} {Debug-Output}
NewInOut:=OldInOut(f); {Aufruf der originalen Leseroutine}
for n:=Integer(f.BufPos) to Integer(f.BufEnd)-1 do begin
case f.BufPtr^[n] of {Zeichen im neu gefllten Puffer inspizieren}
#$0D: Boolean(TextRec(f).UserData[1]):=true;
#$0A: begin
if not Boolean(TextRec(f).UserData[1]) then f.BufPtr^[n]:=#$0D;
Boolean(TextRec(f).UserData[1]):=false;
{Sonderfall: 0D-0A-0A-0A seien 3 Zeilenenden}
end; {... (Beispiel wird zu 0D-0A-0D-0D)}
else Boolean(TextRec(f).UserData[1]):=false;
end{case};
end;
end;
procedure UnixReset(var f: Text);
begin
reset(f);
@OldInOut:=TextRec(f).InOutFunc; {alten Funktionszeiger retten}
TextRec(f).InOutFunc:=@NewInOut; {neuen Funktionszeiger einsetzen}
Boolean(TextRec(f).UserData[1]):=false;
end;
begin
Assign(f,'test.txt'); UnixReset(f);
ReadLn(f,S);
WriteLn('1:',S); {3 Testzeilen}
ReadLn(f,S);
WriteLn('2:',S);
ReadLn(f,S);
WriteLn('3:',S);
end.
Vorgefundene Kodierung: UTF-8 | 0
|