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

    技术2022-05-19  39

    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));


    最新回复(0)