求教:关于数据保存到文件的问题

zt31 2004-09-08 10:07:06
我自定义了以下的结构类型,其中包含一个动态数组,动态数组的大小由nMax,nMin,nStep来决定。现在我想保存其到文件,不知道该采用何种类型。用类型文件的话,里面的变量的长度必须都是固定的。如果用文本文件存,数组可能会很大,会影响存取速度。不知道各位有什么好的建议,最好能说清楚点。

绝对新手,请多指教。

TScanInfo= record
bIsUsed: Boolean;
sSamName: String;
sOperator: String;
dtTestDateTime: TDateTime;
nMax: Integer;
nMin: integer;
nStep: integer;
tScanCoor: TCoordinates;
tTestValue: array of TCurWLInfo;
nStyle: TCurveStyle;
end;
...全文
118 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zt31 2004-09-10
  • 打赏
  • 举报
回复
不好意思,昨天不在公司。
zt31 2004-09-08
  • 打赏
  • 举报
回复
救命啊
zt31 2004-09-08
  • 打赏
  • 举报
回复
我试了一下TFileStream,但是无论我后期给动态数组的大小赋多少值,都没有用。怎么回事?
AirFish 2004-09-08
  • 打赏
  • 举报
回复
好像可以存成流文件,.dat的后缀,具体方法不是太记得了,很多参考资料上都有的,你查一下吧。
荒原独歌 2004-09-08
  • 打赏
  • 举报
回复
你把记录类型改为类类型,从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;
zt31 2004-09-08
  • 打赏
  • 举报
回复
下班了,明天结帖。
欢迎多多指教。
zt31 2004-09-08
  • 打赏
  • 举报
回复
我找到方法了,谢谢各位。

在存取TScanInfo型变量时,其中的动态数组本身就是将其地址存放的,对我来说没什么用。然后我再继续按照tTestValue[i]的形式,保存数据,大功告成。读取数据类似。

好方法,比用文本形式好多了。只是不知道还有没有其它什么方法可以很好的保存数据。

其中发现一个现象,就是Delphi中动态数组的存放,(很大程度上)不是连续的一个内存块,猜想其中是以链表的形势,将每个元素随即存放到不同地址,而每个元素都保存相邻元素的地址。可能能充分利用内存,但是一方面也增加了更多的信息。

新手,所以发现后就说出来了。可能本来就是这个样子,只是我不知道而已。

看过的书很少,本想看看帮助就能搞定,只是Delphi的帮助确实没有MSDN好。这样进展确实缓慢,看来真的要好好找两本书看看了。
risingsoft 2004-09-08
  • 打赏
  • 举报
回复
给你的类型里加入地址指针,使用链表存放到文本文件里吧
zt31 2004-09-08
  • 打赏
  • 举报
回复
除了TFileStream之外还有什么方法吗?哪个会更适合我这种情况呢?因为我在文件前面还要存储一些其他信息。

另外,可以反复用Write这个函数吗,结果是怎么样呢?是文件指针依次后移,还是每次都覆盖前面的内容。读取的时候该怎么判断呢?

谢谢了
luo_jian_dong 2004-09-08
  • 打赏
  • 举报
回复
用 TFileStream,但这个保存的时候,要自己从整体上把握,你把你的动态的地方换成存放地址的形式,就相当存个索引到你的TScanInfo 中,要让TScanInfo 这里是固定的,在通过索引
去找你的变体部分,

TFileStream 是很快的,你不必担心

16,748

社区成员

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

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