(高手请进!)已知一扩展名为dat的文件的数据结构,怎样读取该文件。 ( 积分: 300 )

  • 主题发起人 主题发起人 asdfzxcv66
  • 开始时间 开始时间
A

asdfzxcv66

Unregistered / Unconfirmed
GUEST, unregistred user!
已知一扩展名为dat的文件(里面文件是二进制,且未加密),数据长度都是4byte,如第一个数据元素表示商品名,第二个数据元素表示商品产地,第三个数据元素表示商品价格,第四个数据元素表示商品利润……,数据元素比较多,问如何读出该dat的文件里的数据,我曾经用以下的代码读dat文件,但只能读不是二进制的文件(下面的代码感觉好象有错误,我对流参考了不少文件都没有搞明白),请问我应当怎样读取该文件,请详细给出代码,另外dat文件的长度不定的,我要在不同的时刻读不同的文件(如t时刻文件为1000组数据,t+1时刻文件为1050组数据,t+2时刻文件为1120组数据),即文件在不同的时刻文件长度不同,那用记录可以读吗,是用记录方便还是用流方便。 谢谢!
procedure TForm2.Button1Click(Sender: TObject);
var
str:string;
fs:TFileStream;
vLen:Integer;
begin
try
fs:=TFileStream.Create('d:/abc.dat',fmOpenRead);
SetLength(str,100);//长度 //SetLength给字符串变量或开放性数组指定一个长度。
fs.ReadBuffer(str[1],4); //ReadBuffer从流中将4个字节复制到str[1] 中, 并将流的当前指针向后移动4个字节。
Edit1.Text :=str;
fs.ReadBuffer(str[1],10);
RichEdit1.Text :=str;
fs.ReadBuffer(str[1],4);
edit2.text:= str;
finally
fs.free;
end;
end;
 
扩展名为dat的文件一般为有类型文件
只要知道具体类型就可以读取
比如你能确定为
TType = packed record
Name: array[0..3] of Byte;
Address: array[0..3] of Byte;
....
end;
然后参考一下有类型文件的读写就可以了
 
procedure TForm1.Button1Click(Sender: TObject);
type
TData = packed record
Name: array[0..3] of char;
Address: array[0..3] of char;
Price: array[0..3] of char;
//其它依次定义....
end;

var
fs: TFileStream;
Data: TData;
begin
fs:= TFileStream.Create('d:/abc.dat',fmOpenRead);
while (fs.Size-fs.Position) >= SizeOf(TData) do
begin
fs.Read(Data, SizeOf(TData));

//以下处理数据:
ShowMessage('名称:'+Data.Name+' 地址:'+Data.Address);

///StrToFloat(Data.Price); //strtofloat()或strtoint()转换要视你的原始数据
end;
end;
 
我的这个文件随时间不同不一样的啊
 
呵呵,又看了一下你的问题:.....数据元素比较多,问如何读出该dat的文件里的数据...我要在不同的时刻读不同的文件(如t时刻文件为1000组数据,t+1时刻文件为1050组数据,t+2时刻文件为1120组数据),即文件在不同的时刻文件长度不同,那用记录可以读吗...

其实只要你的文件结构(即元素个数元素大小与元素顺序)不变,那不管你的文件是三组数据还是一万组数据,代码都可以读取而无须修改的.就像数据库程序,只要你的表结构没改,不管你存三条记录还是一万条记录,你程序都是不需要改的
元素大小 - 字段大小
元素个数 - 字段个数
元素顺序 - 字段顺序

估计你没认真看代码就回答"我的这个文件随时间不同不一样的啊"
代码已经是按文件大小来读取的while (fs.Size-fs.Position) >= SizeOf(TData) do
 
//其它依次定义....那我要的定义多少啊!太多了。
 
建议lz学习一下 delphi的数据文件
 
哈哈,偶真的无话可说了.看了下楼猪的注册时间2007-11-26,
难怪,可理解[:D]
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
913
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部