没分了,大虾们可怜可怜我吧。一个把数组写入流和读取的问题。(0分)

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

sujing1982

Unregistered / Unconfirmed
GUEST, unregistred user!
var
Stream : TMemoryStream;
FMax :string;
Msg :array of string ;

procedure TForm1.Button1Click(Sender: TObject);
var
i :Integer;
begin
SetLength(Msg,20); //定义大小
for i:= 0 to high(Msg) do
Msg := '['+inttostr(i)+']'; // 加数据

Stream := TMemoryStream.Create;
Stream .WriteBuffer(Msg,sizeof(Msg));// 把数据写到流
Fmax := inttostr(20);
Stream.WriteBuffer(Fmax,5); //那数组的大小作为字符写入流
end;


procedure TForm1.Button2Click(Sender: TObject);
var
i:Integer;
begin
SetLength(Msg,0); //清空
Stream.Seek(-5,soFromEnd); //读出数组的大小,Fmax =20
Stream.ReadBuffer(Fmax,5); // 这里还是正确
setlength(Msg,strtoint(Fmax)); // 定义数组的大小为Fmax

stream.Seek(-5-sizeof(Msg),soFromEnd); //确定流的位置
stream.ReadBuffer(Msg,sizeof(Msg)); // 读出来数组每项都是空,
end;
为什么读FIORI 的时候出错 的布道正确的数据?????????
望大虾指点一下。
 
Stream .WriteBuffer(Msg,sizeof(Msg));// 把数据写到流
stream.ReadBuffer(Msg,sizeof(Msg)); // 读出来数组每项都是空,
sizeof(msg)
改为length(msg)看看
 
肯定不行的 改为length 读流的时候内存会出错 位置大小都不对了
 
建议你用for循环把String数组里的东西写入Stream里。
或则把string数组换成TStringList!它可比自己定义的string数组好管理多了。
 
好久没有用delphi了,希望能帮上你的忙哈.
下班
 
谢谢 formality
我会试用tstringlist的 但是 上面的代码到底错在哪?? 我最想搞个明白哈。
大虾帮忙哦~
 
你的错误太多了,简单给你说几个:
1:代表动态数组的变量,本身是个指针,因此,sizeOf(msg)=4,因此,你的writebuf是错误的。
2:String变量本身也是个指针,因此字符串数组其实是一个指针数组,也就是说,数组中的每个成员的SizeOf都是4,因此不能用普通的方式将一个String类型的变量写入到流中或者从流中读出。
3、即使你上面写的都对,但是你把写入长度写到流的最后面,这个比较不好往外读,因为字符串本身的长度是不定常的,因此在流中的长度也是不定的。呵呵,另外,你根本就不需要把一个整型书转换成一个字符串再写入到流中,直接将整型数写入就是了。
......
呵呵,毛病太多,不说了。
从你写的代码看,你需要在基本功上下下功夫。
 
放飞 说的级是啊 才学一段时间 还秘密忽忽的呢 多谢指点哈
 
能不能把上面的那段帮我改成正确的??? ? 放飞大虾 !!
 
呵呵,看你这么好学,给你写一份吧,随手写的,没有优化过,自己看吧
procedure TForm1.Button1Click(Sender: TObject);
var
aa, bb: array of String;
i, n: Integer;
FF: TMemoryStream;
begin
SetLength(aa, 20);
for i := 0 to high(aa) do
aa := '[' + IntToStr(i) + ']';

FF := TMemoryStream.Create;
try
FF.Clear;
n := High(aa); //注意,这里的n等于19而不是20,因为是从0索引的
//写入数组的维数
FF.WriteBuffer(n, SizeOf(n));
//写入整个数组
for i := 0 to High(aa) do
begin
//写入一个字符串
n := Length(aa);
FF.WriteBuffer(n, SizeOf(n));
FF.WriteBuffer(aa[1], n);
end;

FF.Seek(0, soFromBeginning);
//读出数组的维数
n := 0;
FF.ReadBuffer(n, SizeOf(n));
//设置动态数组,这里最好限制一下n,
//万一给你个错误的流而读出的n超大,呵呵,你就麻烦了
SetLength(bb, n + 1); //注意这里必须是 n + 1
//读出整个数组
for i := 0 to n do
begin
//读出一个字符串
n := 0;
FF.ReadBuffer(n, SizeOf(n));
SetLength(bb, n);
FF.ReadBuffer(bb[1], n);
end;
finally
FF.Free;
end;

//验证一下读出的东西
for i := 0 to high(bb) do
self.Canvas.TextOut(10, i * self.Canvas.TextHeight('A') + 10, bb);
end;
 
上面在写入和读出的时候没有对字符串为空的情况进行处理,这个你自己处理吧。
另外,在读出的时候,没有对给定的流是否是一个有效的流作判断,因此,整体来说,上面我给的程序只能是抛砖引玉的作用而已,不能直接用在实际当中
 
谢谢 放飞大虾咯。
我自己在多试试。 在次多谢了。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
565
import
I
后退
顶部