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的啊。
晕了
盼您赐教

解决方案 »

  1.   

    呵呵。恕我直言,写得有点乱
    没有运行,不过问题很明显。。
    。。
    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));