我碰到一个很怪异的问题,关于流和StringList。。。(30分)

  • 主题发起人 主题发起人 小ゆ鱼ゆ儿
  • 开始时间 开始时间

小ゆ鱼ゆ儿

Unregistered / Unconfirmed
GUEST, unregistred user!
嗯,我本来的程序是这样的:
var
AStream,BStream:TMemoryStream;
begin
AStream := TMemoryStream.Create ;
BStream := TMemoryStream.Create ;
AStream.LoadFormFile('temp.txt') ;
BStream.Seek(BStream.Size ,soFromBeginning) ;
BStream.CopyFrom(AStream ,AStream.Size) ;
end;
运行正常,但是现在我需要对temp.txt进行一些更改再加入BStream,于是我加上了一个StringList,程序如下:
var
AStream,BStream:TMemoryStream;
List:TStringList;
begin
AStream := TMemoryStream.Create ;
BStream := TMemoryStream.Create ;
List := TStringList.Create ;
List.LoadFromFile('temp.txt') ;
......一些更改,还没有加就出错了
List.SaveToStream(AStream) ;
BStream.Seek(BStream.Size ,soFromBeginning) ;
BStream.CopyFrom(AStream ,AStream.Size) ;
end;

提示说“读取Stream错误”,这是为什么呢?我用AStream.SaveToFile('temp1.txt')来检查,输出的文件是完全一样的。。。
 
var
AStream,BStream:TMemoryStream;
List:TStringList;
begin
AStream := TMemoryStream.Create ;
BStream := TMemoryStream.Create ;
List := TStringList.Create ;
List.LoadFromFile('temp.txt') ;
......一些更改,还没有加就出错了
List.SaveToStream(AStream) ;
AStream.Position:=0;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
BStream.Seek(BStream.Size ,soFromBeginning) ;
BStream.CopyFrom(AStream ,AStream.Size) ;
end;
 
同意楼上。
对流操作过后,注意指针位置。
 
是不是List 与BStream的格式不统一,转化格式试试!
 
为什么要加上这一句呢???
 
这样应该可以了
var
AStream,BStream:TMemoryStream;
List:TStringList;
begin
AStream := TMemoryStream.Create ;
BStream := TMemoryStream.Create ;
List := TStringList.Create ;
List.strings.LoadFromFile('temp.txt') ;
......
List.SaveToStream(AStream) ;
BStream.Seek(BStream.Size ,soFromBeginning) ;
BStream.CopyFrom(AStream ,AStream.Size) ;
end;
 
对啊,加上AStream.Position:=0;就可以了
 
你看一下源码就知道CopyFrom是从原Stream的当前Position拷贝Size数据,而你在List.SaveToStream(AStream) 后,AStream的Position指向最后,你从它的最后读取Size大小的数据当然错误,因为后面没数据啊。所以要将Position置为0,从开始读。
 
哦,对对对,我只注意了目标流的SEEK,呵呵,受教了。。。
 
接受答案了.
 
你的问题已经被他们解决了
 
后退
顶部