[Back to TEXTFILE SWAG index]  [Back to Main SWAG index]  [Original]

{
 JK> I've started out in Pascal and need some information on how
 JK> to read from a certain point in a file, say line 3.  How
 JK> would I set the pointer to line 3 to read into a variable?

 BvG> A seek does not work on textfiles.

 Here, this will assist you. originally in a Pascal Newsletter, so it must
 be PD.

---------------------------------------- CUT HERE --------------------------
}
Unit TextUtl2;  (* Version 1.0 *)

{Lets you use typed-file operators on TEXT files.  Note that I've cut out MOST}
{of the documentation so as to make it more practical for the PNL.  I strongly}
{advise that you get in touch with the author at the address below (I haven't)}
{It's called TEXTUTL2 because it's a rewrite of an earlier unit called        }
{TEXTUTIL which had some nasty limitations.                                   }

{Both files can be FREQed from 3:634/384.0 as TEXTUT*.*, and I strongly       }
{recommend that you do so.                                                    }

{I tried looking up the author's telephone number, but Telecom says the number}
{is silent.  Oh well.                                                         }

{If you're having trouble, netmail me (Mitch Davis) at 3:634/384.6            }


(*
Author: Rowan McKenzie  28/12/88
        35 Moore Ave, Croydon, Vic, Australia

These 3 routines are improvements to Tim Baldock's TEXTUTIL.PAS unit.
I can be contacted on: Eastwood, Amnet or Tardis BBS (Melbourne Australia)
*)

Interface

Uses Dos;

Procedure TextSeek     (Var F : Text; Offset : Longint);
Function  TextFileSize (Var F : Text): LongInt;
Function  TextFilePos  (Var F : Text): LongInt;

Implementation

Procedure TextSeek(Var F : Text; Offset : Longint);

{ seek char at position offset in text file f}

var BFile    : File of byte absolute F;  (* Set up File for Seek *)
    BFileRec : FileRec absolute Bfile;
    TFileRec : TextRec Absolute F;
    OldRecSize : Word;
    oldmode : word;

Begin
  With BfileRec do Begin
    oldmode:=mode;
    Mode := FmInOut;         (* Change file mode so Turbo thinks it is *)
    OldRecSize := RecSize;   (* dealing with a untyped file.           *)
    RecSize := 1;            (* Set the Record size to 1 byte.         *)
    Seek(Bfile,Offset);      (* Perform Seek on untyped file.          *)
    Mode := oldmode;         (* Change file mode back to text so that  *)
    RecSize := OldRecSize;   (* normal text operation can resume.      *)
  end;
  TfileRec.BufPos := TfileRec.BufEnd; (* Force next Readln.              *)
end; {textseek}

Function TextFileSize(Var F : Text): LongInt;

{ determine size of text file f in bytes}

var BFile:File of byte absolute F;
    BFileRec:FileRec absolute Bfile;
    OldRecSize:Word;
    oldmode:word;

Begin
  With BfileRec do Begin
    oldmode:=mode;
    Mode := FmInOut;
    OldRecSize := RecSize;
    RecSize := 1;
    TextFileSize := FileSize(Bfile);
    Mode := oldmode;
    RecSize := OldRecSize;
  end;
end; {textfilesize}


Function Textfilepos(Var F : Text): LongInt;

{ determine current position (in bytes) in text file f}

var BFile:File of byte absolute F;
    BFileRec:FileRec absolute Bfile;
    TFileRec:TextRec Absolute F;
    OldRecSize:Word;
    oldmode:word;

Begin
  With BfileRec do Begin
    oldmode:=mode;
    Mode := FmInOut;
    OldRecSize := RecSize;
    RecSize := 1;
    textfilepos := Filepos(Bfile)-tfilerec.bufend+tfilerec.bufpos;
    Mode := oldmode;
    RecSize := OldRecSize;
  end;
end; {textfilepos}

end.

[Back to TEXTFILE SWAG index]  [Back to Main SWAG index]  [Original]