奇怪了~~~~多加一个begin end就出错。大家帮忙看看啊。(100分)

  • 主题发起人 主题发起人 ColdBlood
  • 开始时间 开始时间
C

ColdBlood

Unregistered / Unconfirmed
GUEST, unregistred user!
代码1:
var
FFile: file;
Buf: THoleState;//自定义记录类型
I: Integer;
begin
AssignFile(FFile, AFileName);
Reset(FFile, 1);
BlockRead(FFile, Buf, SizeOf(THoleState));//这样执行正常。
end;

代码2:
var
FFile: file;
Buf: THoleState;//自定义记录类型
I: Integer;
begin
AssignFile(FFile, AFileName);
Reset(FFile, 1);

for I := HoleArrayLowBound to HoleArrayHighBound do
begin
BlockRead(FFile, Buf, SizeOf(THoleState));//在这里Read之后,Buf就指向无效指针了。或者把for语句注释掉也一样出错。
// HoleIndexOf := Buf;//这行可不加。
end;

 
這一句出問題了...
BlockRead(FFile, Buf, SizeOf(THoleState));
因為SizeOf(THoleState)會不停變化的...
你改為這樣試一下:
var
FFile: file;
Buf: THoleState;//自定义记录类型
I,bufsize: Integer;
begin
AssignFile(FFile, AFileName);
Reset(FFile, 1);
bufsize:=SizeOf(THoleState);
for I := HoleArrayLowBound to HoleArrayHighBound do
begin
BlockRead(FFile, Buf, bufsize);//在这里Read之后,Buf就指向无效指针了。或者把for语句注释掉也一样出错。
// HoleIndexOf := Buf;//这行可不加。
end;
 
可是我这样也出错,怎么解释呢?

var
FFile: file;
Buf: THoleState;//自定义记录类型
I: Integer;
begin
AssignFile(FFile, AFileName);
Reset(FFile, 1);
 begin
BlockRead(FFile, Buf, SizeOf(THoleState));//这样执行正常。
end;
end;

如果我不加begin end 或不加for
这样读取:

var
FFile: file;
Buf: THoleState;//自定义记录类型
I: Integer;
begin
AssignFile(FFile, AFileName);
Reset(FFile, 1);
BlockRead(FFile, Buf, SizeOf(THoleState));//这样执行正常。
BlockRead(FFile, Buf, SizeOf(THoleState));//这样执行正常。
BlockRead(FFile, Buf, SizeOf(THoleState));//这样执行正常。
end;

连续读出的三条数据都正常。
 
是不是文件长度不够读:
var
FFile: file;
Buf: THoleState;//自定义记录类型
I,Count: Integer;
begin
AssignFile(FFile, AFileName);
Reset(FFile, 1);

Count:=FileSize(FFile) Div SizeOf(THoleState);
for I := HoleArrayLowBound to HoleArrayHighBound do
begin
if (I-HoleArrayLowBound)>=Count then Break;
BlockRead(FFile, Buf, SizeOf(THoleState));//在这里Read之后,Buf就指向无效指针了。或者把for语句注释掉也一样出错。
// HoleIndexOf := Buf;//这行可不加。
end;

 
to TYZhang:
可是第一次进入循环的时候就出错了。
  //
 
to ColdBlood:
你的 HoleArrayLowBound 和 HoleArrayHighBound 是什么东西,你试试这样:
var
FFile: file;
Buf: THoleState;//自定义记录类型
I,Count: Integer;
begin
AssignFile(FFile, AFileName);
Reset(FFile, 1);

Count:=FileSize(FFile) Div SizeOf(THoleState);
for I := 1 to Count do
begin
BlockRead(FFile, Buf, SizeOf(THoleState));
end;
 
new(Buf)试试
 
to TYZhang:先谢谢你的关注,我下午就堵在这了。所以比较急..

如果我连续执行三次BlockRead(FFile, Buf, SizeOf(Buf));查看Buf中的内容都是正确的。

HoleArrayLowBound 和 HoleArrayHighBound其实是两个数值。
也可以这样如果用
for I := 1 to 2 do //注意:这里不存在文件长度不够的问题。
begin
BlockRead(FFile, Buf, SizeOf(Buf));//执行第一次就出错。
end

to wwr74:
  这不是指针,不需要new。
 
OK,搞定了。

都不是这些问题。
我的记录类型中的字段string 改为 string[255]就好了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
589
import
I
后退
顶部