大虾帮忙运行下这段代码!!!盼您赐教!!!

yangyugw 2004-05-12 04:29:11
procedure TForm1.BitBtn1Click(Sender: TObject);
var p:pchar;
str:string;
i:integer;
FInstream:TMemoryStream;
begin
for i:=0 to 1 do
str:=str+'a';
p:=pchar(str);
try
FInstream:=TMemoryStream.Create;
FInstream.writeBuffer(p^,i);
FInstream.SaveToFile(edit1.Text)
finally

Finstream.Free;
end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
FInstream:TMemoryStream;
buffer:pchar;
lsize:Longint;
begin
try
FInstream:=TMemoryStream.Create;
FInstream.LoadFromfile(edit1.Text);
memo1.Lines.LoadFromStream(FInstream);
FInstream.Free;
FInstream:=TMemoryStream.Create;
FInstream.LoadFromfile(edit1.Text);
lsize:=FInstream.Size;
GetMem(Buffer,lsize);
FInstream.readBuffer(Buffer^,lsize);
memo1.Lines.Add(buffer+' '+inttostr(strlen(buffer)));
GetMem(Buffer,lsize);
buffer:=pchar('aa');
memo1.Lines.Add(buffer+' '+inttostr(strlen(buffer)))
finally
FInstream.Free;
end;
end;

结果:

aa
aa 5
aa 2

为什么结果有出入,第一个'aa'没错,第二个buffer为什么通过getmem(buffer,lsize)长度成了5了,我的lsize一定是2的啊。
晕了
盼您赐教
...全文
31 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyugw 2004-05-13
  • 打赏
  • 举报
回复
谢谢
halfdream 2004-05-13
  • 打赏
  • 举报
回复
呵呵。恕我直言,写得有点乱。。。
没有运行,不过问题很明显。。
。。。。。
lsize:=FInstream.Size;
GetMem(Buffer,lsize);//读两个字节就只申请两字节空间???
FInstream.readBuffer(Buffer^,lsize);
memo1.Lines.Add(buffer+' '+inttostr(strlen(buffer)));
。。。。
关键在strlen上,它同C语言中strlen是一个意思,就是遇到空字符才作为串结尾。
readbuffer是你要读出几字节就几字节的,不会给它们后面加上空字符的。。

//建议写法。。(没有调试)
var
ReadSize:Integer;


GetMem(Buffer,500);//呵,缓冲适当大一点点。。
ZeroMemory(Buffer,500);//关键是清空
FInstream.readBuffer(Buffer^,lsize);
或者干脆
ReadSize:=FInstream.read(Buffer^,500);

memo1.Lines.Add(buffer+' '+inttostr(strlen(buffer)));
或者
memo1.Lines.Add(buffer+' '+inttostr(ReadSize));


yangyugw 2004-05-13
  • 打赏
  • 举报
回复
why

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧