为什么???(100分)

  • 主题发起人 主题发起人 sauchan
  • 开始时间 开始时间
S

sauchan

Unregistered / Unconfirmed
GUEST, unregistred user!
var
sFile:string;
strm:TStream;
p:PChar;
begin
strm := TFileStream.Create(AFileName, fmOpenRead);
setLength(sFile, strm.Size);//[size = 7158]
p:=@strm;
cn:=Length(P);//[cn = 611];
strm.Free;
end

为什么P的长度只有611呢?[BDS2006]
 
strm 所指向的文件中含有字符 #0 ,估计是第612个字节。
 
的确是这样的.
 
inc(p)支持双字节?
 
“inc(p)支持双字节? ”?不明白。
因为 PChar 类型的指针指向的字符串系统会以 #0 作为字符串的结尾标志符,所以看起来字符参数变少了,当时其实#0后面的数据都是存在与内存的。
使用 PChar 的时候,它所指向的字符串最好避免含有 #0
 
这个问题的确有趣,关注一下:)
 
strm:TStream;
...
p:=@strm
//——这种写法有什么实际意义吗?strm是一个对象指针,而不是什么Buffer

看楼主的意思,应该是在为sFile分配了空间之后,用 strm.Read 将文件的内容读入到
sFile中,然后再让指针指向sFile。
改成这样:

strm.Read(sFile,strm.Size);
p:=@sFile[1];
cn:=Length(sFile)
//为了防止文件中的#0造成的长度误判,应该对sFile求长度而不是p
 
多人接受答案了。
 
后退
顶部