VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 917|回复: 5

关于文件流的一点问题!

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-3 11:10:01 | 显示全部楼层 |阅读模式
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这三个操作方法吗?
回复

使用道具 举报

0

主题

15

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-3 14:06:01 | 显示全部楼层
你的代码问题。在你这个代码中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是从文件尾开始。
回复

使用道具 举报

0

主题

15

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-3 14:09:01 | 显示全部楼层
不对,没发现你的循环变量是从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;
回复

使用道具 举报

0

主题

15

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-3 14:21:01 | 显示全部楼层
等于3或者更大的数字的时候就对了呢?
==========================================================================
这是个碰巧正确。因为你的循环变量从1开始,而你的Seek和Read顺序又颠倒了,加上函数Seek的第二个参数>2时,自动纠正为0,所以Seek恰好等于下个记录的位置,自己分析吧。
回复

使用道具 举报

0

主题

53

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-1-5 07:30:01 | 显示全部楼层
njy7648 无处不在呀  真是不简单。来我的公司得了 呵呵 不过怕养不起你呀
回复

使用道具 举报

0

主题

15

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-5 09:00:01 | 显示全部楼层
今天大家都休息了,所以本人在此解惑,哈哈,真到你公司,恐怕不要工资,你公司也不会要。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表