type  
  TStorage = packed record
    bt01:      byte;
    sName:     string[14];
    SaveDate:  TDateTime;
    dwMakeIdx: DWord;
    wIndex:    Word;
    wDura:     Word;
    wDuraMax:  Word;
    nValue:    array[0..13] of Byte;
    nNone:     Integer;  //保留字节 ???
  end;procedure TForm1.btn1Click(Sender: TObject);
var
  Stor: TStorage;
  I, nCount: Integer;
  Files: TFileStream;
begin
  Files := TFileStream.Create(Pchar(edt1.text), fmOpenReadWrite or fmShareDenyNone);
  Files.Read(nCount, SizeOf(Integer));
  for I := 1 to nCount do
  begin
    Files.Read(Stor, SizeOf(TStorage));
    Files.Seek(I*SizeOf(TStorage), 3);
    mmo1.Lines.Add(IntToStr(Stor.wIndex - 1));
  end;
end;如上的代码为何Seek的第二个参数等于0,1或者2的时候读出来的数据都不对.等于3或者更大的数字的时候就对了呢?这个不是只定义了0,1和2这三个操作方法吗?

解决方案 »

  1.   

    你的代码问题。在你这个代码中Seek不是必须的,可以不要。如果你非要写,也要是下面这样:  for I := 1 to nCount do
      begin
        Files.Seek(I*SizeOf(TStorage), 0);
        Files.Read(Stor, SizeOf(TStorage));
        mmo1.Lines.Add(IntToStr(Stor.wIndex - 1));
      end;0是从文件开始,1是从当前开始,2是从文件尾开始。
      

  2.   

    不对,没发现你的循环变量是从1开始的:
      for I := 0 to nCount - 1 do
      begin
        Files.Seek(I*SizeOf(TStorage), 0);
        Files.Read(Stor, SizeOf(TStorage));
        mmo1.Lines.Add(IntToStr(Stor.wIndex - 1));
      end;
    或者:
      for I := 1 to nCount do
      begin
        Files.Seek((I - 1) * SizeOf(TStorage), 0);
        Files.Read(Stor, SizeOf(TStorage));
        mmo1.Lines.Add(IntToStr(Stor.wIndex - 1));
      end;
      

  3.   

    等于3或者更大的数字的时候就对了呢?
    ==========================================================================
    这是个碰巧正确。因为你的循环变量从1开始,而你的Seek和Read顺序又颠倒了,加上函数Seek的第二个参数>2时,自动纠正为0,所以Seek恰好等于下个记录的位置,自己分析吧。
      

  4.   

    maozefa(阿发伯) 无处不在呀  真是不简单。来我的公司得了 呵呵 不过怕养不起你呀