[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]
{Aitor Gonzalez was kind enough to post a chunk of code which included the following
fragment which I reworked. Someone out there might just be looking of the Text
equivalents of Seek and FilePos; here they are
}
program TestSeekAndFilePos(input,output);
uses
DOS;
procedure TextFileSeek(
var F : Text;
L : LongInt
);
{ Seek byte L in text file F:
The following code is from Arne de Bruijn, 1994;
with modifications by Aitor Gomez Gonzalez, Feb 19, 1996;
and reformatting by F. Li, Feb 20, 1996.
} begin
FileRec((@F)^).Mode:=fmInOut; { Set to binary mode
The (@F)^ part is to let TP 'forget' the type of the structure, so
you can type-caste it to everything (note that with and without (@X)^
can give a different value, longint(bytevar) gives the same value as
bytevar, while longint((@bytevar)^) gives the same as longint
absolute Bytevar (i.e. all 4 bytes in a longint are readed from
memory instead of 3 filled with zeros)) }
FileRec((@F)^).RecSize:=1; { Set record size to 1 (byte size record)
L:=(FilePos(File((@F)^))-TextRec(F).BufEnd)+TextRec(F).BufPos;
Get the fileposition, subtract the already read buffer, and add the
position in that buffer }
TextRec(F).Mode:=fmInput; { Set back to text mode }
TextRec(F).BufSize:=SizeOf(TextBuf); { BufSize overwritten by RecSize }
{ Doesn't work with SetTextBuf! }
FileRec((@F)^).Mode:=fmInOut; { Set to binary mode }
FileRec((@F)^).RecSize:=1; { Set record size to 1 (a byte)}
Seek(File((@F)^),L); { Do the seek }
TextRec(F).Mode:=fmInput; { Set back to text mode }
TextRec(F).BufSize:=SizeOf(TextBuf); { Doesn't work with SetTextBuf! }
TextRec(F).BufPos:=0; { Reset buffer counters }
TextRec(F).BufEnd:=0;
end { TextFileSeek };
function TextFilePos(
var F : Text
) : LongInt;
var
P : longint;
{ Pretend that F is not a text file and return FilePos(F):
The above code was "b..." by F. Li, Feb 20, 1996
to create the following code:
N.B. The modifier denies any knowledge of how the code works! -
hence ...code was "b..." (butchered? buggered?...)
} begin
FileRec((@F)^).Mode:=fmInOut; { Set to binary mode
The (@F)^ part is to let TP 'forget' the type of the structure, so
you can type-caste it to everything (note that with and without (@X)^
can give a different value, longint(bytevar) gives the same value as
bytevar, while longint((@bytevar)^) gives the same as longint
absolute Bytevar (i.e. all 4 bytes in a longint are readed from
memory instead of 3 filled with zeros)) }
FileRec((@F)^).RecSize:=1; { Set record size to 1 (byte size record)
L:=(FilePos(File((@F)^))-TextRec(F).BufEnd)+TextRec(F).BufPos;
Get the fileposition, subtract the already read buffer, and add the
position in that buffer }
TextRec(F).Mode:=fmInput; { Set back to text mode }
TextRec(F).BufSize:=SizeOf(TextBuf); { BufSize overwritten by RecSize }
{ Doesn't work with SetTextBuf! }
FileRec((@F)^).Mode:=fmInOut; { Set to binary mode }
FileRec((@F)^).RecSize:=1; { Set record size to 1 (a byte)}
P:=FilePos(File((@F)^));
TextFilePos:=P-TextRec(F).BufEnd+TextRec(F).BufPos;
{ Do the FilePos }
TextRec(F).Mode:=fmInput; { Set back to text mode }
TextRec(F).BufSize:=SizeOf(TextBuf); { Doesn't work with SetTextBuf! }
end { TextFilePos };
var
i : integer;
Line : string;
LineNumber : integer;
MyFile : text;
Position : array [1..99] of longint;
{ Test Seek and Pos for TextFile } begin
Assign(MyFile,'SeekPos.Pas');
Reset(MyFile);
LineNumber:=0;
while not EOF(MyFile) do begin
Inc(LineNumber);
Position[LineNumber]:=TextFilePos(MyFile);
ReadLn(MyFile,Line);
end;
i:=1;
while i <= LineNumber do begin
TextFileSeek(MyFile,Position[i]);
ReadLn(MyFile,Line);
WriteLn(Output,Line);
Inc(i); Inc(i);
end;
Close(MyFile);
end { TestSeekAndFilePos }.
[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]