您的位置:首页 > 其它

使用TFileStream读取文件,分析自定义结构的数据文件。

2011-03-07 23:11 423 查看
TFileStream对文本读取的操作。有个竞争对手的数据是他们自己写的结构体,然后存成一个文件。我就是用了一个小工具,解读出他们的结构体,然后做了个循环,把它们的数据都读出来的。

好在他们的文件没有加密。

分析的小工具呢,我上传的资源里面有。其规则如下:

字符串的存储是,一个Byte和一个String一起保存的。比如“Love”存在文件中,是先保存一个值为4的Byte,再保存“Love”这个字符串。

Double的存储,是直接保存一个8位。

Integer保存一个4位的值。

假如它们的表结构如下:

ID integer;

aName:varchar(255);

Count:double;

当然这个结构先要用工具分析出来。就上面写的那个。这个简单的比方,如果没有加密,明眼人一下就能看出来的。

然后写个程序循环读出数据来就好了。比方只读其中一个:

type ReadD=record

ReadID:integer;

ReadName:array[0..1023]of char;

ReadCount:double;

end;

var

RD:ReadD;

ln:byte;

//create打开文件

Files.read(RD.Readid,sizeof(integer));

Files.read(ln,sizeof(ln));

Files.read(RD.ReadName,ln);

Files.read(RD.ReadCount,sizeof(double));

就读出一条记录啦。

通常使用这种方式存储字符串的。比较省空间。而且有时候使用这种方法,插入空白区域。

readID

定义部分:

var
sel:Integer;
buf:array[0..1023]of char;
ln:byte;
i,p1,p2,ep:integer;
Rstr:string;
Rint:Integer;
Rdouble:Double;
Rbyte:Byte;

函数体主要部分:

Files.Position:=i;
Files.Read(ln,sizeof(ln));
if i+ln>ep then exit;
Files.Read(buf,ln);
rstr:=buf;
mmo1.Lines.Add('Pos:'+inttostr(i)+' Len:'+inttostr(Ln)+' Str:'+rstr);

Files.Position:=i;
Files.Read(rint,sizeof(rint));
mmo1.Lines.Add('Pos:'+inttostr(i)+' Int:'+inttostr(rint));

Files.Position:=i;
Files.Read(rdouble,sizeof(rdouble));
mmo1.Lines.Add('Pos:'+inttostr(i)+' Dbl:'+floattostr(rdouble));

Files.Position:=i;
Files.Read(ln,sizeof(ln));
mmo1.Lines.Add('Pos:'+inttostr(i)+' byte:'+inttostr(ln));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐