问如何把数组通过流保存到文件中,然后再读到这个数组里? ( 积分: 100 )

  • 主题发起人 主题发起人 3166
  • 开始时间 开始时间
3

3166

Unregistered / Unconfirmed
GUEST, unregistred user!
type
Taa = record
ntime : Tdatetime;
s : string[3];
end;
type
Taaaaa = record
pp : string[4];
cc : array[0..10] of Taa;
end;
var
arraytemp : array of Taaaaa;
请问如何把数组arraytemp保存到文件中,然后再读到这个数组里?
 
type
Taa = record
ntime : Tdatetime;
s : string[3];
end;
type
Taaaaa = record
pp : string[4];
cc : array[0..10] of Taa;
end;
var
arraytemp : array of Taaaaa;
请问如何把数组arraytemp保存到文件中,然后再读到这个数组里?
 
var
arraytemp : array of Taaaaa;
m:TMemoryStream;
//////////////////////////////
...
m.write(arraytemp,sizof(arraytemp));
m.savetofile...

m.seek(...);
m.read(arraytemp,sizeof(arraytemp));
 
根本不需要通过流
 
这个是动态数组啊
我也这么做的,可是读出来的内容不对啊
procedure Tform1.savearytofile; // 保存数组到文件
var
m: TMemorystream
begin
setlength(t1,2);
arraytemp[0].pp := 'ppp';
arraytemp[0].cc[0].s:=11.33;
m:=TMemorystream.Create;
m.WriteBuffer(arraytemp,sizeof(arraytemp));//向流中写入内容
m.SaveToFile('temp.dat');//保存到文件里
m.Free;
end;
procedure TDM.loadaryfromfile; // 读文件到数组
var
m: TMemorystream;
begin
SetLength(arraytemp,2);
m:=TMemorystream.Create;
m.LoadFromFile('temp.dat'); //从文件里读
m.ReadBuffer(arraytemp,sizeof(arraytemp)); //向rec中写入内容
m.Free;
end;
最后
showmessage(arraytemp[0].pp);
showmessage(floattostr(arraytemp[0].cc[0].s));结果都不对啊
 
Taaaaa = record
pp : string[4];
cc : array[0..10] of Taa;
end;

不要这样嵌套试试,record中都用简单数据类型
 
ExTempFile.WriteBuffer(arraytemp,sizeof(arraytemp));//向流中写入内容

这里有问题,sizeof(arraytemp)返回只是arraytemp这个指针的数据大小,应该是:

ExTempFile.WriteBuffer(arraytemp,sizeof(Taaaaa)*Length(arraytemp));//
 
读取并给数组赋值是要拆开来的,即给数组的每一项赋值,而不能将整个数据块赋值给一个
多元素(项)的数组。
arraytemp : array of Taaaaa;是动态数组,数组元素类型是Taaaaa,所以我想你应该以
Sizeof(Taaaaa)为单位大小来读数据并赋值给arraytemp的各个元素。如下:

procedure TDM.loadaryfromfile; // 读文件到数组
var
i :integer;
m: TMemorystream;
begin
SetLength(arraytemp,2);
m:=TMemorystream.Create;
m.LoadFromFile('temp.dat'); //从文件里读
for i :=Low(arraytemp) to High(arraytemp) do //循环读取每一项
m.ReadBuffer(arraytemp,sizeof(Taaaaa)); //给每一项赋值
m.Free;
end;

>>代码没有测试过,但思想是这样,你可以改进一下<<
 
这个代码是测试过的,完全符合你的要求:
=========================================================
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
Taa = record
ntime : Tdatetime;
s : string[3];
end;

Taaaaa = record
pp : string[4];
cc : array[0..10] of Taa;
end;

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

arraytemp : array of Taaaaa;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
m: TMemorystream;
begin
setlength(arraytemp,2);
arraytemp[0].pp := 'ppp';
arraytemp[0].cc[0].s:='1.3';
m:=TMemorystream.Create;
m.Write(arraytemp[0],2*sizeof(arraytemp[0]));//向流中写入内容
m.SaveToFile('c:/temp.dat');//保存到文件里
m.Free;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
m: TMemorystream;
begin
SetLength(arraytemp,2);
m:=TMemorystream.Create;
m.LoadFromFile('c:/temp.dat'); //从文件里读
m.ReadBuffer(arraytemp[0],2*sizeof(arraytemp[0])); //向rec中写入内容
m.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
showmessage(arraytemp[0].pp);
showmessage(arraytemp[0].cc[0].s);
end;

end.
 
谢谢SparkV,为什么要2*sizeof(arraytemp[0])呢?
 
当然啊,你的数组里面有两个元素,那当然得乘上2啦!
 
根本不需要流操作,直接把数组中的数据保存到文件或从文件读数据到数组就可以了,只不过在定义结构时,如果使用的上把STRING改成CHAR。如s : array[0..2] of char,pp : array[0..3] of char.
 
后退
顶部