如何从一个流中读取一段数据。(50分)

  • 主题发起人 主题发起人 水边的汤姆
  • 开始时间 开始时间

水边的汤姆

Unregistered / Unconfirmed
GUEST, unregistred user!
今有一个流:TOleStream,这里面存储着1G数据,其中有一段是我想要的,请问如何从中读取出来?已知这段数据的在TOleStream中的开始位置和数据长度,即Postion和size。请问如何能够实现?希望高手赐教。
 
试试TStream的Memory属性,是一个指针,你直接用这个指针进行操作应该可以吧。
 
先seek
后read
 
我想从中读取出一段数据,放到另外一个内存流中,谁有源码,请赐!
 
我有一个想法,不知道这样写对不对。首先将TOleStream的Position移动到指定的位置,然后定义一个Buffer: array of byte,然后调用TOleStream.ReadBuffer方法,读出指定长度的数据到Buffer空间里面,最后,创建一个内存流:TMemoryStream,将Buffer中的内容写入TMemoryStream,返回TMemoryStream即可。
这样做对否,请指教。
 
很正确,

自己写代码测试一下效果吧

seek
read
write

需要用到的几个函数大家都已经帮你列出来了
 
1:读到string中 (已知数据中没有字符串结尾的)
tmpStr:String;
YouOleStream.Postion:=Postion;
YouOleStream.ReadBuffer(tmpStr[1],size);
2:读到BUFF中
tmpChar:array[0..8000] of char;
fillchar(tmpChar,sizeof(tmpChar),#0);
YouOleStream.Postion:=Postion;
YouOleStream.ReadBuffer(tmpChar,size);
3读到流中
stream:TMemoryStream;
.........
stream.clear;
YouOleStream.Postion:=Postion;
stream.CopyFrom(YouOleStream,size);
 
result:= nil;
index:= -1;
index:= self.fJXTBIndexList.IndexOf(JXBianHao);
if Index>=0 then

begin

JXTBIndexPointer:= pJXTBIndex(self.fJXTBIndexList.Objects[index]);
//读取机械台班的含量流
//打开机械台班含量流
MyOleStream:= self.OpenStream(c_JXTBContent);
MyOleStream.Position := JXTBIndexPointer.Offset;
Setlength(Buffer,JXTBIndexPointer.BlockSize);
MyOlestream.ReadBuffer(Buffer[0],JXTBIndexPointer.BlockSize);
MyOleStream.Free;
MyOlestream:= nil;
MyMemStream:= TMemoryStream.Create;
MyMemStream.WriteBuffer(Buffer[0],JXTBIndexPointer.BlockSize);
//从MyMemStream中读取数据
MyMemStream.Position := 0;
MyMemStream.ReadBuffer(rJXTBContent,sizeOf(JXTBContent));

result:= TSimplexMachine.Create(nil);
result.BianHao := JXTBIndexPointer.JXBianHao;
result.MingCheng := JXTBIndexPointer.JXMingCheng;
result.DEDanJia := rJXTBContent.DEDanJia;
result.DQDanJia := self.fJXTBGLJAreaPrice[index];

//读取机械台班的构成含量
rGeshu.Count := 0;
MyMemStream.ReadBuffer(rGeShu,SizeOf(GeShu));
index:= -1;
for index:= 0 to rGeShu.Count-1do

begin

//读取含量
MyMemStream.ReadBuffer(rGLJContent,SizeOf(GLJContent));
aSimplexPrice:= TSimplexPrice.Create(result);
aSimplexPrice.BianHao:= rGLJContent.BianHao;
if rGlJContent.LeiBei = 'R' then

aSimplexPrice.ObjCostType := ctRenGong
else
if rGlJContent.LeiBei = 'C' then

aSimplexPrice.ObjCostType := ctCaiLiao
else
if rGlJContent.LeiBei = 'J' then

aSimplexPrice.ObjCostType := ctJiXie
else

aSimplexPrice.ObjCostType := ctOther;
aSimplexPrice.MingCheng := rGLJContent.MingCheng;
aSimplexPrice.DanWei := rGLJContent.DanWei;
aSimplexPrice.DEDanJia := rGLJContent.DEDanJia;
end;
 
这是鄙人源码中的一部分。
其中,buffer定义为一下两种或者多种方式都可以。常用以下方式:
var
buffer: array of byte;
buffer: array of char;
 
DELPHI技术交流群:23889386
 
后退
顶部