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这三个操作方法吗?
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这三个操作方法吗?
begin
Files.Seek(I*SizeOf(TStorage), 0);
Files.Read(Stor, SizeOf(TStorage));
mmo1.Lines.Add(IntToStr(Stor.wIndex - 1));
end;0是从文件开始,1是从当前开始,2是从文件尾开始。
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;
==========================================================================
这是个碰巧正确。因为你的循环变量从1开始,而你的Seek和Read顺序又颠倒了,加上函数Seek的第二个参数>2时,自动纠正为0,所以Seek恰好等于下个记录的位置,自己分析吧。