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