zoukankan      html  css  js  c++  java
  • 给 "水桶" 同学解释一下 "流" 类中的 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;
    

  • 相关阅读:
    [BZOJ2434][Noi2011]阿狸的打字机
    [BZOJ2303][Apio2011]方格染色
    [BZOJ1912][Apio2010]patrol 巡逻
    [BZOJ1179][Apio2009]Atm
    [BZOJ1178][Apio2009]CONVENTION会议中心
    Lock-less buffer management scheme for telecommunication network applications
    vue-router@2.x 只适用于 Vue 2.x 版本。
    jQuery 捕获
    jQuery Chaining
    jQuery Callback 方法
  • 原文地址:https://www.cnblogs.com/del/p/2053854.html
Copyright © 2011-2022 走看看