紧急求助!!!如何将不同的记录格式便捷的写入到一个文件里面!!!解决后立即给分!!!高手都跑哪里去了???

zhenwang 2004-08-17 08:38:04
在 delphi开发指南上的例子里一般都是一个文件只有一种记录格式,比如:
type
testrecord=packed record
columnA :string[20];
columnB :Integer;
....
end;

然后在文件中进行写入和读取,
var
F:File of testrecord;
begin
AssignFile(F,'test.dat');
Reset(F);
....
end;

现在的问题是,如果要在一个文件中存储多中记录格式的数据该怎么办呢 ?
比如我定义了两种(或两种以上 )记录格式
type
recordA=packed record
columnA:string[20];
columnB:Integer;
end;

recordB=packed record
columnB:string[50];
columnA:Integer;
end;

...
然后,我要写入这样的记录到同一个文件中该怎么做呢?怎么去声明文件类型?因为用 F:File of recordA的方式只能声明一种记录格式的文件,但现在这个文件是多个记录格式?
想了很久没有办法,特来求助!希望大侠不吝指导!
这个问题对我很重要,希望大侠们能最好讲解的详细一点,而且最好有示例代码!!分不够再开贴给!!
...全文
90 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhenwang 2004-08-18
  • 打赏
  • 举报
回复
顶!!!!
redlegend_126_com 2004-08-18
  • 打赏
  • 举报
回复
对,利用ini文件也可以的。只要uses inifiles
就可以了,具体的东西可以搜索到
荒原独歌 2004-08-18
  • 打赏
  • 举报
回复
上面的内容copy的时候出错了:)

存到一个文件里在Object pascal里也有实现的方法,你可以用 iBear(大熊 不要怀疑我的温柔) 老兄方法,这个方法可以把若干个不同类型的记录放到一个文件里!你说的不能?我不明白是什么意思!
还有一个方法,你把记录类型改为类类型,从TComponent集成。然后使用流可以实现。
改写如下:

type
recordA=class(TComponent)
private
FcolumnA:string[20];
FcolumnB:Integer;
published //注意!!一定是published才行
property columnA: string read FcolumnA write FcolumnA;
property columnB: Integer read FColumnB write FcolumnB;
end;

给你段参考代码,里面的TNode和TEdge是两个不同的类
保存对象到文件:
function TShortWay.SaveTopo(FileName: String): Boolean;
var
stream : TMemoryStream;
iNodeCnt : Integer;
iEdgeCnt : Integer;
NodeTmp : TNode;
begin
stream := TMemoryStream.Create;
try
for iNodeCnt := 0 to FNodeList.Count - 1 do
begin
NodeTmp := FNodeList.Items[iNodeCnt];
NodeTmp.EdgeCnt := NodeTmp.EdgeList.Count;
stream.WriteComponent(NodeTmp);
for iEdgeCnt := 0 to NodeTmp.EdgeCnt - 1 do
begin
stream.WriteComponent(TEdge(NodeTmp.EdgeList[iEdgeCnt]));
end;{end for iEdgeCnt}
end;{end for iNodeCnt}
stream.SaveToFile(FileName);
Result := True;
finally
stream.Free;
end;{end try}
end;

读文件到对象里:
function TShortWay.ReadTopo(FileName: String): Boolean;
var
stream : TMemoryStream;
iEdgeCnt : Integer;
NodeTmp : TNode;
EdgeTmp : TEdge;
begin
stream := TMemoryStream.Create;
try
stream.LoadFromFile(FileName);
while stream.Position <> stream.Size do
begin
NodeTmp := TNode.Create(Application);
stream.ReadComponent(NodeTmp);
FNodeList.Add(NodeTmp);
for iEdgeCnt := 1 to NodeTmp.EdgeCnt do
begin
EdgeTmp := TEdge.Create(Application);
stream.ReadComponent(EdgeTmp);
NodeTmp.EdgeList.Add(EdgeTmp);
end;{end for}
end;{end while}
Result := True;
finally
stream.Free;
end;{end try}
end;

另:50分真的太少,请另开贴给分!~~~~~~~:)
荒原独歌 2004-08-18
  • 打赏
  • 举报
回复
iBear(大熊 不要怀疑我的温柔),感谢你的回答,但我想知道像网文快捕或者网博士这些软件他们最终都是把信息都存储到一个文件里,你觉得他们的实现方式是怎么样的呢?恳请赐教!
=================================================================================

存到一个文件里在Object pascal里也有实现的方法,你可以用 iBear(大熊 不要怀疑我的温柔) 老兄方法,这个方法可以把若干个不同类型的记录放到一个文件里!你说的不能?我不明白是什么意思!
还有一个方法,你把记录类型改为类类型,从TComponent集成。然后使用流可以实现。
type
recordA=cal
columnA:string[20];
columnB:Integer;
end;

recordB=packed record
columnB:string[50];
columnA:Integer;
end;
whitetiger8 2004-08-17
  • 打赏
  • 举报
回复
嗯, iBear(大熊 不要怀疑我的温柔) 说的对呵
无类型可以做到兼容
iBear 2004-08-17
  • 打赏
  • 举报
回复
你可以使用无类型文件

然后直接把这些记录的内容已二进制的方式写进去,写之前多写一个标志字节表明下面的内容那种类型的记录就行了,这样的话无论你有多少记录都是可以保存在同一个文件

var
a: RecordA;
b: RecordB;
p: pointer;
flag: byte;

assignfile(f, 'filename');
rewrite(f, 1);

flag := 1;
blockwrite(f, flag, 1, 1);
p := @a;
blockwrite(f, p^, sizeof(a), 1);
flag := 2;
blockwrite(f, flag, 1, 1)
p := @b;
blockwrite(f, p^, sizeof(b), 1);
...

读的时候做类似处理就可以得到数据了

另外,如果你记录中的数据可以用文本的方式保存的话(如果没有一大段的二进制数据),那么你也可以使用ini或xml文件格式来存放,使用xml更为的灵活

iBear 2004-08-17
  • 打赏
  • 举报
回复
不知他们获取的是什么信息

如果数据量比较多,也许会用数据库的,这样数据的查找也会方便
zhenwang 2004-08-17
  • 打赏
  • 举报
回复
iBear(大熊 不要怀疑我的温柔),感谢你的回答,但我想知道像网文快捕或者网博士这些软件他们最终都是把信息都存储到一个文件里,你觉得他们的实现方式是怎么样的呢?恳请赐教!

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧