最简单的问题。但我都糊涂了。。。。看一下吧。(20分)

  • 主题发起人 主题发起人 nzfsoft
  • 开始时间 开始时间
N

nzfsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
程序如下:

procedure TForm1.Button1Click(Sender: TObject);
var
iFileLength,iFileHandle,iBytesRead:integer;
pszBuffer:array[0..31] of char;
i:integer;
Buffer,s:string;
begin
//s:='00-90-0b-01-cc-52';
iFileHandle := FileOpen('C:/Mac.nzf', fmShareDenyRead);
Buffer:=StringOfChar(' ',35);
iFileLength:=FileSeek(iFileHandle,-35,2);
iBytesRead:=FileRead(iFileHandle,pszBuffer,35);
FileClose(iFileHandle);
S:='';
S:=PszBuffer;<<<<<<<<运行到这里,就出错了。
ShowMessage (pszBuffer);《《《《《但这一句就没有错。
end;
 
我试了一下,没问题,但是我打开的是自己机器上的文件
可能是你的文件有问题
 
procedure TForm1.Button1Click(Sender: TObject);
var
iFileLength,iFileHandle,iBytesRead:integer;
pszBuffer:array[0..31] of char;
i:integer;
Buffer,s:string;
begin
s:='00-90-0b-01-cc-52';
iFileHandle := FileOpen('C:/1.SQL', fmShareDenyRead);
Buffer:=StringOfChar(' ',31);
iFileLength:=FileSeek(iFileHandle,-31,2);
iBytesRead:=FileRead(iFileHandle,pszBuffer,31);
FileClose(iFileHandle);
S:='';
S:= STRING(PszBuffer);//<<<<<<<<运行到这里,就出错了。
ShowMessage (pszBuffer);//《《《《《但这一句就没有错。
end;
你把35,都改为31就OK了,你破坏了内存
 
String 和Array 不兼容,不能这么做

 
SetLength一下先
 
NewFat:为什么我破坏了内存?
为什么改为31?我可以改为36或38等其它数字吗?
 
什么不兼容?String本身就能看作是Array
定义的变量有些根本就没作用。
跟踪代码可以看到。如果FileRead中第三个参数比第二个参数的长度要长,变量S失效了。
而且,第三个参数应该设为32,为Length(第二个参数)

delphi中不建议使用这组文件操作的函数。
 
我把数字全改为31都成功。如果>31则失败。
奇怪。
 
真的吗?试试看。
procedure TForm1.Button1Click(Sender: TObject);
var
iFileLength,iFileHandle,iBytesRead:integer;
pszBuffer:array[0..31] of char;
i:integer;
Buffer,s:string;
begin
s:='00-90-0b-01-cc-52';
iFileHandle := FileOpen('C:/1.SQL', fmShareDenyRead);
Buffer:=StringOfChar(' ',3000);
iFileLength:=FileSeek(iFileHandle,-3000,2);
iBytesRead:=FileRead(iFileHandle,pszBuffer,32);
FileClose(iFileHandle);
S:='';
S:= STRING(PszBuffer);//<<<<<<<<运行到这里,就出错了。
ShowMessage (pszBuffer);//《《《《《但这一句就没有错。

end;
 
可能是文件的错。
在我的机子上正确(只是语法)。
 
按影子的讲法:
iBytesRead:=FileRead(iFileHandle,pszBuffer,31);
改为:
iBytesRead:=FileRead(iFileHandle,pszBuffer,Length(pszBuffer));

运行通过。。。
 
不能按某某的说法,使用函数前最好清楚它的参数的意思。
 
后退
顶部