怎么把memorystream读到string里面去?(50分)

  • 主题发起人 主题发起人 whaoye
  • 开始时间 开始时间
W

whaoye

Unregistered / Unconfirmed
GUEST, unregistred user!
这是一小段程序,
var
mystream:tmemorystream;
s:string;
begin
mystream:=tmemorystream.Create;
try
mystream.Write('123456',6);
mystream.Read(s[1],6);
showmessage(s);
finally
mystream.Free;
end;
为什么在showmessage(s)的时候,我没有得到我期望的'123456'?
什么地方不对呢?
并且如果我在中间修改一下:
mystream.Write('123456',6);
mystream.position:=0;
mystream.Read(s[1],6);
showmessage(s);
就出错,为什么?
 
还没给字符串分配空间呢
 
1、delphi默认字符串类型ansistring会自动初始化为空,因为
为空,s[1]根本无意义,所以mystream.Read(s[1],6);这一
句会出错;

2、执行mystream.Write('123456',6);这一句后,mystream的
Position位置为6,无法执行mystream.Read(s[1],6);

3、而你的应用程序在加入mystream.position:=0;後才报错的原
因是:在执行mystream.Read(s[1],6);前,应用程序并不知道
s[1]为非法地址。

至于如何将TMemoryStream转为String,我这里有经典控件CIS的一段
源码:
stream : TMemoryStream;
p, q : PChar;

p := Stream.Memory;
q := p + Stream.Size;// -1
fixed by Shay Horovitz
r := p;
while (p <> nil) and (p < q) do begin
while (p < q) and (p^ <> #13) and (p^ <> #10) do
Inc(p);
Memo.Lines.Add(Copy(StrPas(r), 1, p - r));
if (p[0] = #13) and (p[1] = #10) then
Inc(p, 2)
else
Inc(p);
r := p;
end;

里面有转换功能,但希望你不但能知道如何做,还能知道为什么
这样做,所以没做处理。


不知道答案是否满意?
 
字符串也需要空间?
他不是固定的256个字节长度么?
我以前一直以为是string<==>array[0..255] of char
 
不对,字符串只有赋值的时候,才会分配空间,
初始化的时候是空的。
 
哎呀,今天才弄清楚这些问题。多谢多谢。

茶叶蛋:很早就很仰慕你了。呵呵:)
能否聊聊?
 
好啊,聊吧。QQ:6160694,不好意思,刚刚看到。

不用仰慕,我也有很多问题要问大家呢,呵呵。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
712
import
I
I
回复
0
查看
687
import
I
后退
顶部