基本文件读写--读到buffer后,从中提出数字(50分)

  • 主题发起人 主题发起人 张鸿林
  • 开始时间 开始时间

张鸿林

Unregistered / Unconfirmed
GUEST, unregistred user!
设有一个记录文件F
type TRec=record
field1:array[1..10] of char;
field2:word;
end;
TRecFile=File of TRec

//下面这个过程没有问题
procedure p1;
var F:TRecFile;
aRec:TRec;
begin
assign(f,aFileName);
reset(f);
read(f,aRec);
//这时,我们很容易从aRec.Field2访问到数值
//。。。
end;
//下面例子怎么办:
procedure p1;
var F:File;
buf:array[1..12];
begin
assign(f,aFileName);
reset(f);
blockread(f,buf);
//这时,我们如何从buf中获得数字???
//。。。
end;
 
blockread要指定大小的,你如果知道下一个读进来的是什么类型,就知道应该读入
的字节数,然后直接赋值。

比如说,你知道下一个读进的是整数,那么:
var
N,G:Integer;
begin
...
N := SizeOf(Integer);
BlockRead(fStream, G, N);
...
end;
简单吧。
 
SORRY没看清题目:(
 
改进如下:
var
N:Integer;
r: TRec;
buf:array[1..12] of char;
begin
...
N := SizeOf(TRec);
BlockRead(fStream, Buf, N);
Move(Buf,r,N);//r里面什么都有了
...
end;
还是简单。
 
或者你干脆定义一个指针强制将BUF转换成TREC。直接读最好了:
r: TRec;
BlockRead(fStream, r, N);
 
Type pRec=^TRec;

pRec(@Buf[1])^.Field2
 
上面的解法理论上是适用的,但有时候由于存储边界的原因
sizeof(trec)会“意外”地不等于所有字段长度的总和,所以读写记录文件
还是用标准方法比较好
 
iie需要注意的是,SIZEof(trec)不等于总长,不是意外,而是因为ALIGN

无论你使用FILE OF TREC还是其他方法,写入长度都是SIZEOF(TREC),
所以这些都没问题,无所为标准还是不标准

倘若你希望长度为所有的总和,那么,
你直接使用TREC=PACKED RECORD
就可以了,或者你可以使用{$a-}
DELPHI6现在支持更多的选择,可以指定对齐字节数
 
采纳huzzz的方法(move)
顺便交待一下这个问题的背景:
有一个没有字段描述的记录文件,包含几十个字段,几十万条记录,且开发者为了
不让分析,故意在文件里加入许多无关垃圾
我想把这个文件倒到标准数据库,先手工分析记录起始位,记录长
然后写一个记录分析器,任意分析n百条记录(根据#0),人工给予字段名,字段
类型,自动生成建库脚本
然后执行导出工作
本来我可以根据分析程序建立的记录声明一个record,用在导出程序上,
但这个文件每次新版本数据的结构都不一样,
我不想为每个版本写一个导出程序,因此提出这个问题
谢谢各位
 
我刚才没发分成功吗?
 
后退
顶部