请看下面的代码:
-----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
lpData,pch:PChar;
str :String;
stream :TMemoryStream;
begin
//为了测试,先分配一个字符串常量
str:='This is a string.And This is an extra string.';
pch:=@str[1]; //首先直接把字符指针指向一个字符串常量 GetMem(lpData,Length(pch)); //分配空间
CopyMemory(lpData,pch,Length(pch));//复制内存块 //将复制过来的内存块写到内存流中
stream:=TMemoryStream.Create;
stream.Write(PChar(lpData),Length(lpData)); //释放掉内存块,然后重新分配空间...
FreeMem(lpData);
GetMem(lpData,stream.Size); //从内存流中回写到新分配的内存块中
stream.Position:=0;
stream.Read(lpData,stream.Size); //为什么这里得到的lpData是乱码,而且长度只有 5 ?
ShowMessage(lpData+' 长度:'+IntToStr(Length(lpData))); //为什么这里保存得到的文件中虽然是45个字节
//但是也是乱码??
stream.SaveToFile('D:\a.txt');
//...
//最后做一些释放清除操作等
end;
-------------------------------------------------------------------------
为什么 lpData 释放后又重新分配空间就不行了呢?
而且用流直接保存成文本文件,得到的是乱码,是怎么回事?怎么解决?
哪位高手帮小弟解决一下,先谢过了!
-----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
lpData,pch:PChar;
str :String;
stream :TMemoryStream;
begin
//为了测试,先分配一个字符串常量
str:='This is a string.And This is an extra string.';
pch:=@str[1]; //首先直接把字符指针指向一个字符串常量 GetMem(lpData,Length(pch)); //分配空间
CopyMemory(lpData,pch,Length(pch));//复制内存块 //将复制过来的内存块写到内存流中
stream:=TMemoryStream.Create;
stream.Write(PChar(lpData),Length(lpData)); //释放掉内存块,然后重新分配空间...
FreeMem(lpData);
GetMem(lpData,stream.Size); //从内存流中回写到新分配的内存块中
stream.Position:=0;
stream.Read(lpData,stream.Size); //为什么这里得到的lpData是乱码,而且长度只有 5 ?
ShowMessage(lpData+' 长度:'+IntToStr(Length(lpData))); //为什么这里保存得到的文件中虽然是45个字节
//但是也是乱码??
stream.SaveToFile('D:\a.txt');
//...
//最后做一些释放清除操作等
end;
-------------------------------------------------------------------------
为什么 lpData 释放后又重新分配空间就不行了呢?
而且用流直接保存成文本文件,得到的是乱码,是怎么回事?怎么解决?
哪位高手帮小弟解决一下,先谢过了!
lpData,pch:PChar;
str :String;
stream :TMemoryStream;
begin str:='This is a string.And This is an extra string.';
// pch:=@str[1]; //這句錯了, 不能這樣 GetMem(lpData,Length(str) + 1);
//CopyMemory(lpData,pch,Length(pch));
CopyMemory(lpData, @str[1], Length(str)); stream:=TMemoryStream.Create; stream.Write(lpData^, Length(lpData));
FreeMem(lpData);
GetMem(lpData,stream.Size);
stream.Position:=0;
stream.Read(lpData^, stream.Size);
ShowMessage(strpas(lpData)+ ' -- Len: '+IntToStr(Length(lpData))); // stream.SaveToFile('D:\a.txt');
stream.Free;
end;
pch := PChar(str);stream.Write(PChar(lpData),Length(lpData)); 也有问题,lpData本身就是PChar,难道还要PChar()一下?其他的没有看了。
小弟受教了原来是
stream.Write(lpData^, Length(lpData));
和
stream.Write(lpData, Length(lpData));
的不同.Write的参数1是指针类型的啊,我一直弄混了.顺便请问一下:
stream.Write(lpData^, Length(lpData));
和
stream.Write(lpData, Length(lpData));
有什么不同呢?麻烦给我解释清楚点好吗?免得我以后又犯同类错误.
也谢谢 ddqqyy(ddqqyy)
lpData 是指針地址,
lpData^ 是這個指針引用的內容