• 给 "水桶" 同学解释一下 "流" 类中的 Seek() 方法



    问题来源: http://www.cnblogs.com/del/archive/2008/01/01/1022130.html#2103357

    TStream 有 Seek() 方法, 它的子类们(TFileStream、TMemoryStream、TBytesStream、TStringStream、TResourceStream、TStreamAdapter、THandleStream...)也都有 Seek() 方法, 且用法一样.

    另外它们也都有 Position 属性, 使用 Position 属性完全可以代替 Seek() 方法, 通过 Position 还可以方便地 "读取" 当前位置;
    但如果只是移动位置, 使用 Seek() 方法更方便.

    方法的参数: Seek(偏移量, 偏移的起始点), 返回值是偏移后的当前位置.
    偏移量: 以字节为单位, 负值表示向前偏移;
    起始点: 0 表示从头算起、1 表示从当前位置算起、2 表示从尾部算起; 从尾部算起时, 偏移量应该是个负值.

    指示起始点时, 可以使用 soFromBeginning、soFromCurrent、soFromEnd 三个常数, 但最好使用枚举 TSeekOrigin = (soBeginning, soCurrent, soEnd);
    Seek() 方法有两个重载, 就是可以使用常数、也可以使用枚举来标识偏移的起始点.

    例子:

    procedure TForm1.FormCreate(Sender: TObject);
    var
      stream: TBytesStream; //以字节流举例
      C: Char; //用于读取字符的变量
    begin
      {建立并初始化化流}
      stream := TBytesStream.Create(BytesOf('ABCDEFGHIJKLMNOPQRSTUVWXYZ'));
      ShowMessage(StringOf(stream.Bytes)); //测试赋值结果: ABCDEFGHIJKLMNOPQRSTUVWXYZ
    
      {从起始点读取一个字符}
      stream.Position := 0;
      stream.Read(C, 1);
      ShowMessage(C); //A
    
      {Read() 和 Write() 方法都会更新当前位置, 继续读取:}
      stream.Read(C, 1);
      ShowMessage(C); //B
    
      {...}
      stream.Seek(3, soBeginning);
      ShowMessage(IntToStr(stream.Position)); //3
    
      stream.Seek(2, soCurrent);
      ShowMessage(IntToStr(stream.Position)); //5
    
      stream.Seek(-2, soCurrent);
      ShowMessage(IntToStr(stream.Position)); //3
    
      stream.Seek(-1, soEnd);
      ShowMessage(IntToStr(stream.Position)); //25
      stream.Read(C, 1);
      ShowMessage(C);                         //Z
    
      stream.Seek(-stream.Size, soEnd);
      ShowMessage(IntToStr(stream.Position)); //0
      stream.Read(C, 1);
      ShowMessage(C);                         //A
    
      stream.Position := 4;
      ShowMessage(IntToStr(stream.Position)); //4
      stream.Read(C, 1);
      ShowMessage(C);                         //E
    
      stream.Free;
    end;
    

  • 相关阅读:
    apache安装
    docker搭建redis主从
    docker安装
    sklearn工具-绪论
    数学基础-矩阵和线性代数
    数学基础-概率论与贝叶斯先验
    数学基础-数学分析
    数据科学包——Matplotlib
    数据科学包——pandas
    数据科学包——numpy
  • 原文地址:https://www.cnblogs.com/del/p/2053854.html
Copyright © 2020-2023  润新知