用tfilestream
修改position即可。

解决方案 »

  1.   

    如果知道文件格式可用blockread,blockwrite,seek定位。选有用的看吧。
    procedure TMainForm.btnCopyClick(Sender: TObject);
    var
      SrcFile, DestFile: File;
      BytesRead, BytesWritten, TotalRead: Integer;
      Buffer: array[1..500] of byte;
      FSize: Integer;
    begin
      AssignFile(SrcFile, 'srcfile.tst');
      AssignFile(DestFile, 'destfile.tst');
      Reset(SrcFile, 1);
      try
        Rewrite(DestFile, 1);
        try
          try
            TotalRead := 0;
            FSize := FileSize(SrcFile);
            repeat
              BlockRead(SrcFile, Buffer, SizeOf(Buffer), BytesRead);
              if BytesRead > 0 then
              begin
                BlockWrite(DestFile, Buffer, BytesRead, BytesWritten);
                if BytesRead <> BytesWritten then
                  raise Exception.Create('Error copying file')
                else begin
                  TotalRead := TotalRead + BytesRead;
                  prbCopy.Position := Trunc(TotalRead / Fsize) * 100;
                  prbCopy.Update;
                end;
              end
            until BytesRead = 0;
          except
            Erase(DestFile);
            raise;
          end;
        finally
          CloseFile(DestFile);
        end;
      finally
        CloseFile(SrcFile);
      end;
    end;
    unit persrec;interface
    uses Classes, dialogs, sysutils;type  TPersonRec = packed record
        Name: String[20];
        ID: String[8];
        Sex: String[1];
        BirthDay: TDateTime;
        Age: Integer;
      end;  TRecordStream = class(TFileStream)
      private
        function GetNumRecs: Longint;
        function GetCurRec: Longint;
        procedure SetCurRec(RecNo: Longint);
      protected
        function GetRecSize: Longint; virtual;
      public
        function SeekRec(RecNo: Longint; Origin: Word): Longint;
        function WriteRec(const Rec): Longint;
        function AppendRec(const Rec): Longint;
        function ReadRec(var Rec): Longint;
        procedure First;
        procedure Last;
        procedure NextRec;
        procedure PreviousRec;
        property NumRecs: Longint read GetNumRecs;
        property CurRec: Longint read GetCurRec write SetCurRec;
      end;implementationfunction TRecordStream.GetRecSize:Longint;
    begin
      Result := SizeOf(TPersonRec);
    end;function TRecordStream.GetNumRecs: Longint;
    begin
      Result := Size div GetRecSize;
    end;function TRecordStream.GetCurRec: Longint;
    begin
      Result := (Position div GetRecSize) + 1;
    end;procedure TRecordStream.SetCurRec(RecNo: Longint);
    begin
      if RecNo > 0 then
        Position := (RecNo - 1) * GetRecSize
      else
        Raise Exception.Create('已经到达文件的开始。');
    end;function TRecordStream.SeekRec(RecNo: Longint; Origin: Word): Longint;
    begin
      Result := Seek(RecNo * GetRecSize, Origin);
    end;function TRecordStream.WriteRec(Const Rec): Longint;
    begin
      Result := Write(Rec, GetRecSize);
    end;function TRecordStream.AppendRec(Const Rec): Longint;
    begin
      Seek(0, 2);
      Result := Write(Rec, GetRecSize);
    end;function TRecordStream.ReadRec(var Rec): Longint;
    begin
      Result := Read(Rec, GetRecSize);
      Seek(-GetRecSize, 1);
    end;procedure TRecordStream.First;
    begin
      Seek(0, 0);
    end;procedure TRecordStream.Last;
    begin
      Seek(0, 2);
      Seek(-GetRecSize, 1);
    end;procedure TRecordStream.NextRec;
    begin
      if ((Position + GetRecSize) div GetRecSize) = GetNumRecs then
        raise Exception.Create('已经到达文件的结尾')
      else
        Seek(GetRecSize, 1);
    end;procedure TRecordStream.PreviousRec;
    begin
      if (Position - GetRecSize >= 0) then
        Seek(-GetRecSize, 1)
      else
        Raise Exception.Create('已经到达文件的开始');
    end;end.
      

  2.   

    谢谢诸位!
    我是想Seek后读出当前指针所指的文件位置的值(如:AA或3F)
      

  3.   

    值可根据数据类型倒着往回算例如
    type  TPersonRec = record
        Name: String[20];
        ID: String[8];
    end;
    一个记录共占28.
        reset(sfile, 1);
        seek(sfile, 28*5);
        blockread(sfile,person,sizeof(personrec));
    就是读第六个记录
      

  4.   

    我是想Seek后读出当前指针所指的文件位置存储的值例如文件aaa.dat
    x)儘^R*窷(蝻@pr褭勋|讏渄貱,F!n坦$€4,S?录ubx血b2釦9跕PS6貖D雝頺堜?頹?JJ鑍*尰爈毗Vw$Zb?5?)?`B/莒60`i蓄 ??t?v4迅T尷 澁c燔葴篡s2[2H飤?k&ar#8嫸?\K澢?[圹睅鹃袚Z胱 N
    我想读出他第5个位置的值是^; 第6个位置的值是R
      

  5.   

    哥们儿,用流吧(tFileStream)。关于他的用法,见DELPHI的帮助