|
易凡 管理员
 
Administrator - UID
- 1
- 精华
- 2
- 积分
- 5253
- 威望
- 5 度
- 性别
- 男
|
阁楼
大 中
小 发表于 2007-5-31 02:29 只看该作者
Delphi中将文件流的数据写入动态数组
var
myfile:TfileStream;
mybuf:array of Pchar;
begin
myfile:=TfileStream.Create('d:\a.txt',fmOpenReadWrite);
setlength(mybuf,myfile.size);
myfile.ReadBuffer(mybuf[0],myfile.Size);
//delete(String(mybuf),1,myfile.Size-4);
showmessage(pchar(mybuf));
因为delphi中的静态组是在运行前就分配好了,所以它的变量地址就是些数组的第一维地址,即没有描述部份,故它的sizeof为1个字节,而动态数组是在运行期间动态分配一个内存块,所以它的变量地址部分需要一个描述部分,故它的sizeof为四个字节,用于存放描述表,所以在 Readbuffet时,需要采用些数组的第一维地址为起始地址,才不会导致溢出。
我试了几次,才发现动态数组按照常规的方式无法用来读取文件流。
如下面的代码
[Copy to clipboard]
CODE:
if ifopen = false then
begin
pics:=tfilestream.Create('GraphicEx_4.bin',fmopenreadwrite);
ifopen:=true;
end;
setlength(buf,p.picsize); //这里p.picsize是一个动态变化的整数
pics.Position:=p.picadd+15;
pics.ReadBuffer(buf[0],p.picsize);//最关键是这里,第二个参数我最早使用sizeof(buf)程序一运行就出错……,而如果你使用pics.ReadBuffer(buf,p.picsize);也是错误的,程序竟然直接就退出……。原因就如上文所说。
for i:=0 to p.picsize-1 do
memo2.Lines.Add(inttohex(buf,2));
妖城欢迎您!
|