知道“流”的come in!(200分)

  • 主题发起人 主题发起人 idoudo
  • 开始时间 开始时间
I

idoudo

Unregistered / Unconfirmed
GUEST, unregistred user!
var<br>Source:TFileStream;<br>Target:TMemoryStream;<br>MyFileSize:integer;<br>begin<br>try<br>Target:=TMemoryStream.Create;<br>Lastit:=TMemoryStream.Create;<br>Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);<br>try<br>Source.Seek(-sizeof(MyFileSize),soFromEnd);//!!!<br>Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//!!!读出资源大小<br>Source.Seek(-MyFileSize,soFromEnd);//!!!定位到资源位置<br>Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//!!!取出资源<br>Target.SaveToFile(TargetFile);//存放到文件<br>finally<br>Target.Free;<br>Source.Free;<br>end;<br>except<br>Result:=false;<br>Exit;<br>end;<br>Result:=true;<br><br>谁能解释下 !!!的地方 &nbsp;到底是怎么回事,网上找不到详细的意思。<br>比如 Source.Seek(-sizeof(MyFileSize),soFromEnd);//当soFromEnd时 其中第一个参数奥0或负数的 但什么时候是0,什么时候是负数呢~ 那个MyFileSize的作用是什么? <br><br>有什么资料可以让像我这样从0开始学的~~
 
Source.Seek(-sizeof(MyFileSize),soFromEnd);//!!!<br>从文件尾部开始,定位到文件的头,负数表示向前移动指针,整数表示向后移动.<br>Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//!!!读出资源大小<br>读完了之后,指针自动到了文件尾部,所以还要在seek回来.<br><br>别的你写的挺明白的.
 
//这样写你应该明白了吧<br>Source.Seek(-sizeof(integer),soFromEnd);//!!!读尾巴的4个字节。<br>Source.ReadBuffer(MyFileSize,sizeof(integer));//!!!读出资源大小<br>// 这4个字节里保存着文件的大小信息<br>Source.Seek(-MyFileSize,soFromEnd);//!!!定位到资源位置<br>//读上(上面)字节<br>Target.CopyFrom(Source,MyFileSize-sizeof(integer));//!!!取出资源<br>//读数据。必须把尾巴的大小去除
 
楼上已经说了,来晚了...
 
Stream的问题delphi的help都讲的很详细的了
 
hityou回答的正确
 
Source.Seek(-sizeof(MyFileSize),soFromEnd);//!!!<br>从文件尾部开始,定位到文件的头||负数表示向前移动指针,整数表示向后移动.<br>-------------------------有点理解了……<br>1. &nbsp;负数表示向前(文件头部指向尾部的方向?)移动指针(也就是说不在文件的地址里,而是在它的后面?),整数则反之。<br>2. &nbsp;还有 我把source指定到一个文件(899KB),然后我在<br>Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));后面加了一句<br>showmessage('MyFileSize= '+inttostr(MyFileSize));//这个‘MyFileSize’应该是这个文件的大小了吧(网中戏 说‘这4个字节里保存着文件的大小信息<br>’),但为什么它显示出来的是“615940”呢?而不是899*1024(920576)呢?<br>3. &nbsp;Source.Seek(-sizeof(integer),soFromEnd);//是不是说 integer大小的地址就可以放的下文件的大小了?如果integer还放不下 文件的大小 那就会出错!!?<br>4. &nbsp;Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//!!!取出资源<br>这里的‘MyFileSize-sizeof(MyFileSize)’不就是0了吗?<br>网中戏--‘//读数据。必须把尾巴的大小去除’你的意思是不是把source文件的后面东西去掉?但事实好象是把文件后面的拿(COPY)过来,放到Target里去的。<br>---Sorry,又提出那么多的问题来了 ~~[:(][:(][:(]
 
看看DELPHI的帮助,最多就把也一起金山词打开,<br>理解了就好的啊,关健的我想也就这几个Position,Seek,ReadBuf,WriteBuf,CopyFrom...<br>最主要的当是Position了,时刻都要很清楚当前的Position是什么
 
建议实际做个例子,在例子中多showmessage几次position,想看清楚点的话,还可以随时ms.saveToFile('c:/test.txt');就明白了.<br>我最初也是对流非常困惑,弄不清是人流还是物流,是上流还是下流:)<br>动手写个test,将seek,copyfrom,setSize,read,write等几个函数统统都用上,十分钟后,你会觉得:不过尔尔.
 
iseek &nbsp;挺幽默的~~[:D] &nbsp;我原来在 一个别人的例子上看的~~改起来特麻烦; <br>‘十分钟后,你会觉得:不过尔尔. ’ 试试~呵呵
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=23218<br>这个 &nbsp;例题 &nbsp;我有几个不明白的地方。<br>加密中:Target.WriteBuffer(MyFileSize,sizeof(MyFileSize)); <br>为什么要用“sizeof(MyFileSize)”直接 “4” 不就一样了啊!~<br>同理的问题就在解密函数中:Source.Seek(-sizeof(MyFileSize),soFromEnd); <br>Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源大小 <br>直接“Source.ReadBuffer(MyFileSize,4);” &nbsp;不也一样吗? &nbsp;<br><br>因为 “sizeof(MyFileSize)”就是4 嘛~~~~~~~<br><br><br>这个问题 捆饶我 好长了~~~~~~~~~~
 
在程序中通常都是要避免直接使用常数的,那样对于以后的升级维护很麻烦。<br>比如你的结构提改了,哪4期不是也要改。有可能就忽略了导致错误。
 
Position,Seek,ReadBuf,WriteBuf,CopyFrom...中<br>Position,Seek,CopyFrom &nbsp;这三个 我 已经明白了~~现在就是 <br>ReadBuf,WriteBuf 这2函数 用法含义不懂~
 
ReadBuffer(变量,sizeof(变量)) 从流中当前位置读取sizeof(变量)个数据到变量中<br>WriteBuffer(变量,sizeof(变量)) 将变量中的sizeof(变量)个数据写入流中当前位置<br>注意Position,Seek与上两个函数配合使用
 
我本来也是这么理解的,可是 Read(integervar,sizeof(integervar));读出来的数据大小 却 不一样/? show出来的integervar 有33232132那么位数大小的数 文件的postion也没有在最后啊~~为什么会出现这个情况呢.<br>哎,还是要自己都加练习了
 
SizeOf是算变量占用的实际内存字节大小。Integer占用4个字节,所以你的Read只不过读了4个字节而已。<br>ShowMessage(IntToStr(SizeOf(Intergervar)));<br>自己看
 
而你那个33232132是integervar这个变量的值。
 
Read(ir,4); //这个是4是存放ir大小的 地址大小;就是说ir要小于2^(4*8)大小
 
多人接受答案了。
 
后退
顶部