流中定义文件头的变量的赋值更改问题 困扰我好久了!!!(100)

  • 主题发起人 主题发起人 zysunit
  • 开始时间 开始时间
Z

zysunit

Unregistered / Unconfirmed
GUEST, unregistred user!
我用流写了一个压缩 定义了一个文件头 文件头的有几个变量 如 s1,s2,s3:string 等等这样 但我生成了一个文件后 在程序中我现在又要更新其中的一个变量的赋值 如 原来 s2:=100000 现在改为 s2:=400000 不知有那位有这方面的经验没有? 能帮我写个小例子就更好了 先谢谢了
 
写文件..按顺序写,按顺序读.先把文件读入内存,修改指定位置的值就行了
 
我也试了 好象不行哦 写进去然后读出来后是乱码 可能是我修改指定位置的值的地方有点问题有没有那位有个简单的例子 帮我示范示范 我太笨了点
 
分少了点
 
//写:string类型的要写上这个string的长度,读取的时候就可以按照记录的长度进行读取 FOffset := AStream.Position; AStream.Write(FID, SizeOf(FID)); WordLen := Length(PChar(FWord)); AStream.Write(WordLen, SizeOf(WordLen)); AStream.Write(Pchar(FWord)^, WordLen );//读取文件: AStream.Read(FID, SizeOf(FID)); AStream.Read(WordLen, SizeOf(WordLen)); SetLength(FWord, WordLen); AStream.Read(Pchar(FWord)^, WordLen );
 
to zkktom: 分少了可以再加嘛 to boying2023: 可能是我没写清吧 你贴的这点我会 流的写入和读取我会 我主要是更新修改文件头 也就是写进去了的变量的值重新改变 我翻遍了以前的老贴子也没有这方面的东东
 
1. 不明白楼主哪里有问题?2. 简单提示: 流是流, 压缩是压缩, 一步一步的解决;3. 估计楼主有可能在结构定义时出点理论上的问题, 特别是使用String;
 
原来 s2:=100000 现在改为 s2:=400000比如你这个变量是第三个写入,从文件头开始,加上前2个变量的Size,就是这个变量的地址,直接修改就行了,不明白你哪有问题
 
我是如下这样定义文件头的, 但压缩文件有上百个或更多, 我现在压缩完后,需要修改第二个 var SaleSoftID:string; // (长度为12)我只需要更新它,别的不要改了 to smlabc: 如果如你所说我就需要重新SaveToStream一遍了 是这样吗? to 新世纪:我主要是用流来SaveToStream 转存一个成自己格式的文件 如 *.kk,*.ff之类的文件Procedure TClassZip.WriteHeader(Var HeaderStream:TMemoryStream; var EducationalLevel:string; // (长度为1) var SaleSoftID:string; // (长度为12) var HYVersion:string; // (长度为1) var CompressDate:string; // (长度为10) var CompressPathLength:integer; //压缩文件路径的长度() var compressPathstr:string //压缩文件路径 () );begin HeaderStream.Position :=0; if Length(EducationalLevel) > 0 then HeaderStream.WriteBuffer(EducationalLevel[1],Length(EducationalLevel)); HeaderStream.Position :=Length(EducationalLevel); if Length(SaleSoftID) > 0 then HeaderStream.WriteBuffer(SaleSoftID[1],Length(SaleSoftID)); HeaderStream.Position :=Length(EducationalLevel)+Length(SaleSoftID); if Length(HYVersion) > 0 then HeaderStream.WriteBuffer(HYVersion[1],1); HeaderStream.Position :=Length(EducationalLevel)+Length(SaleSoftID) +Length(HYVersion); if Length(CompressDate) > 0 then HeaderStream.WriteBuffer(CompressDate[1],10); ......end;
 
你这个存的有问题啊...从参数定义来看,那几个string是定长的可是你在代码里又是按实际变量长度来存储的,可是在存储的时候又没有保存string的实际长度还有代码也有问题WriteBuffer以后stream的指针就是在末尾,没必要再去操作Position另外,你的这段代码没有涉及到压缩操作不知道你是先把要压缩的文件压缩完了以后再把这个头加上去,还是先把头加上去再和文件一起做的压缩?如果是第二种,那么你就别想读出来我建议你上面的代码这样改begin HeaderStream.Position :=0; HeaderStream.WriteBuffer(Length(EducationalLevel),sizeof(integer)); HeaderStream.WriteBuffer(EducationalLevel[1],Length(EducationalLevel)); HeaderStream.WriteBuffer(Length(SaleSoftID),sizeof(integer)); HeaderStream.WriteBuffer(SaleSoftID[1],Length(SaleSoftID)); setlength(HYVersion,1); HeaderStream.WriteBuffer(HYVersion[1],1); setlength(CompressDate,10); HeaderStream.WriteBuffer(CompressDate[1],10); ......end;
 
to hs-kill: 前面四个变量是固定的长度 后面两个才是不定长度 这段代码应该是没问题的 我用了 都能读取出来 测试了不下1000 次 我问题的关键在于: 辟如我要改变第二个 SaleSoftID(长度为12) 的值 如原来写进去是 111111111111 现在改为 222222222222 我在不重新 SaveToStream 的情况下能不能修改它的值
 
你的所谓savetostream是指什么? 写入压缩流? 还是将头文件和压缩后的数据写入另一个流?还有,既然要修改,就不能把头文件一起压缩,不知道你是不是这么做的如果不是,那修改只需要读到对应的位数重新写入就行了var ms:tmemorystream; str:string;begin ms:=tmemorystream.create; setlength(str,10); ms.write(str[1],10); setlength(str,5); ms.write(str[1],5);... ms.position:=10; str:='11111'; ms.write(str[1],5); //这样重新定位写入就行了end;
 
他现在已经是文件了,使用FileStream读出来,Seek位置,再Write,最后Free掉FileStream就行了
 
谢谢你们 我搞出来了 综合了你们几个的 特别是smlabc hs-kill 谢谢了 给分
 
谢谢了 给分
 
后退
顶部