我在程序中定义了一个动态长度的记录结构,该结构包含一个动态长度的数组记录:
type
TCite = record
id: string[5];
name: string[8];
depict: string[30];
end;
type
TAA = record
a: string[5];
b: integer;
cite: array of TCite;
end;
var
aa: array of TAA;
如何将数组的内容保存到一个文件,并正确的读出来?我以前用的是固定长度的如下定义:
type
TAA = record
a: string[5];
b: integer;
cite:string[20];
end;
保存:
procedure TForm1.Button3Click(Sender: TObject);
var
I: Integer;
xFile: TMemoryStream;
path: string;
begin
i := length(aa);
if i > 0 then
begin
path := ExtractFilePath(Application.EXEName) + '\aa.dat';
xFile := TMemoryStream.Create;
xFile.Write(i, sizeof(i));
for i := 0 to high(aa) do
xFile.Write(aa[i], sizeof(aa[i]));
xFile.SaveToFile(path);
xFile.Free;
end;
end;
打开:
procedure TForm1.Button4Click(Sender: TObject);
var
c_path: string;
xFile: TMemoryStream;
i, j: integer;
begin
c_path := ExtractFilePath(Application.EXEName) + '\aa.dat'; xFile := TMemoryStream.Create;
xFile.LoadFromFile(c_path);
xFile.Read(j, sizeof(j));
for i := 0 to j - 1 do
begin
setlength(aa, i + 1);
xFile.Read(aa[i], sizeof(aa[i]));
end;
xFile.Free;
end;
固定长度的保存和打开都可以实现,但不知怎么保存包含动态长度的数组。
type
TCite = record
id: string[5];
name: string[8];
depict: string[30];
end;
type
TAA = record
a: string[5];
b: integer;
cite: array of TCite;
end;
var
aa: array of TAA;
如何将数组的内容保存到一个文件,并正确的读出来?我以前用的是固定长度的如下定义:
type
TAA = record
a: string[5];
b: integer;
cite:string[20];
end;
保存:
procedure TForm1.Button3Click(Sender: TObject);
var
I: Integer;
xFile: TMemoryStream;
path: string;
begin
i := length(aa);
if i > 0 then
begin
path := ExtractFilePath(Application.EXEName) + '\aa.dat';
xFile := TMemoryStream.Create;
xFile.Write(i, sizeof(i));
for i := 0 to high(aa) do
xFile.Write(aa[i], sizeof(aa[i]));
xFile.SaveToFile(path);
xFile.Free;
end;
end;
打开:
procedure TForm1.Button4Click(Sender: TObject);
var
c_path: string;
xFile: TMemoryStream;
i, j: integer;
begin
c_path := ExtractFilePath(Application.EXEName) + '\aa.dat'; xFile := TMemoryStream.Create;
xFile.LoadFromFile(c_path);
xFile.Read(j, sizeof(j));
for i := 0 to j - 1 do
begin
setlength(aa, i + 1);
xFile.Read(aa[i], sizeof(aa[i]));
end;
xFile.Free;
end;
固定长度的保存和打开都可以实现,但不知怎么保存包含动态长度的数组。
解决方案 »
- 怎样将最大值求出
- 有Delphi7.0的.exe文件,能弄出源代码吗?
- 心里堵得慌!!! Rave中为什么在设计期设置的字体在运行时,都统一是宋体呢?为什么????
- LOG文件的读取。
- 在Form中不能保存自定义内容?Form的DefineProperties不起作用?
- MRP的全称,是什么意思?
- 大家来共享资源啦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 250告急!!找组件求救!!
- 怎样做网络拓扑图???
- 当选择*.HTML过滤,则FILELISTBOX(WIN31)中出现两个同名文件
- 討論下: keydown事件裏的key:=0 有用嗎?
- 盛大急聘Delphi程序员高手!!!
type
TAA = record
a: string[5];
b: integer;
count:integer;
cite:array of TCite;
end;
保存:
procedure TForm1.Button3Click(Sender: TObject);
var
I,j: Integer;
xFile: TMemoryStream;
path: string;
begin
i := length(aa);
if i > 0 then
begin
path := ExtractFilePath(Application.EXEName) + '\aa.dat';
xFile := TMemoryStream.Create;
xFile.Write(i, sizeof(i));
for i := 0 to high(aa) do
begin
xFile.Write(aa[i], sizeof(aa[i]));
for j := 0 to aa[i].count - 1 do // Iterate
begin
xFile.Write(aa[i].cite[j], sizeof(aa[i].cite[j]));
end; // for
end;
xFile.SaveToFile(path);
xFile.Free;
end;
end;
打开:
procedure TForm1.Button4Click(Sender: TObject);
var
c_path: string;
xFile: TMemoryStream;
i, j,p: integer;
begin
c_path := ExtractFilePath(Application.EXEName) + '\aa.dat'; xFile := TMemoryStream.Create;
xFile.LoadFromFile(c_path);
xFile.Read(j, sizeof(j));
for i := 0 to j - 1 do
begin
setlength(aa, i + 1);
xFile.Read(aa[i], sizeof(aa[i]));
for p := 0 to aa[i].count - 1 do // Iterate
begin
setlength(aa[i].cite, p + 1);
xFile.Read(aa[i].cite[p], sizeof(aa[i].cite[p]));
end; // for
end;
xFile.Free;
end;
执行打开操作时会出错,是不是我哪里写错了?
setlength(aa[i].cite, p + 1);
出错。
BCB中可以ReadFile,WriteFile也很方便。
流操作也可以啊。