记录类型存盘问题?(100分)

  • 主题发起人 主题发起人 xzmyzy
  • 开始时间 开始时间
X

xzmyzy

Unregistered / Unconfirmed
GUEST, unregistred user!
1.记录类型的结构
type
test = packed record
a: Boolean;
b: Integer;
c: string;
end;
ptest = ^test;

function SaveData(data:test
const filename: string): boolean;
var
Stream: TFileStream;
begin
Result := true;
try
Stream := TFileStream.Create(filename, fmCreate);
try
Stream.Position := 0;
Stream.WriteBuffer(data, SizeOf(data));
data.a:= true;
data.b:= 100;
data.c:= 'xzm';
Stream.WriteBuffer(data, SizeOf(data));
finally
Stream.Free;
end;
except
Result := false
{writing failed}
end;
end;

function LoadData(data:ptest
const filename: string): boolean;
var
Stream: TFileStream;
lCount: integer;
begin
Result := true

try
Stream := TFileStream.Create(filename, fmopenread);
try
Stream.Position := 0;
lCount:= Stream.Read(ldata^, SizeOf(ldata^));
lCount:= Stream.Read(ldata^, SizeOf(ldata^));
finally
Stream.Free;
end;
except
Result := false

end;
end;


2.将记录存入文件
procedure TForm1.Button7Click(Sender: TObject);
var a:test;
begin
a.b:=1;
a.c:= self.Edit1.text;//将Edit.text赋给a.c则不行,为什么? //'test';如果用字符串常量则可以
savedata(a,'c:/xzm.txt');
caption:=a.c;
end;

3.从文件中取记录数据
procedure TForm1.Button8Click(Sender: TObject);
var a:test;
begin
//new(a);
caption:= '';
loaddata(@a,'c:/xzm.txt');
caption:=a.c;
end;
以上代码中,a.c:= edit1.text存入不能正确读出,用a.c:='test'则可以,为什么?如何解决?
 
如果字符串不长的话把c:String换成c:ShortString;
要不就自己逐个字段写入长度和内容
 
能不能说得详细点.
在这里觉得好象是地址有错.a.c:= '字符串常量';则没问题,而如果用a.c:= Edit1.text,非字符串常量则不行,就象writebuffer(a,sizeof(a))中的a指向的内存有错似的!
 
a.c:= pchar(self.Edit1.text);
试一下
 
function SaveData(data:ptest
const filename: string): boolean

//把data的類型改為PTest指針類型
function LoadData(ldata:ptest
const filename: string): boolean

//這里的data是不是ldata?

procedure TForm1.Button7Click(Sender: TObject);
var p:pTest
//結構怎能實例化,只能用結構指針進行引用
begin
New(p)
//分配空間
p.b:=1;
p.c:= Edit1.text;//這里就沒必要用self.Edit.text了
savedata(p,'c:/xzm.txt');
caption:=p.c;
dispose(p)
//釋放空間
end;

procedure TForm1.Button8Click(Sender: TObject);
var p:PTest;
begin
new(p);
caption:= '';
loaddata(p,'c:/xzm.txt');
caption:=p.c
//奇怪,p.c為何沒有在loaddata過程中賦值,因此Caption是空的
Dispose(p);
end;
 
方法一、记录类型存盘使用blockwrite,写就可以了,读取的时可以使用blockread。
方法二、听说xml配置文件可以保存记录类型。已经代替了传统的.ini,可以增加你的思路。
 
1、楼主保存的文件中string类型实际上只是一个指针(可以查看文件)。
2、如果保存文件时赋常数值,程序重新运行时常数的分配地址是固定的,即文件中保存的指针指向的内存地址所在的字符串是一致的,造成了字符串保存到文件中的假象,如果改变常数值重新编译一把(注意:不保存文件),然后再读取旧文件,读出的字符串就变掉了。
3、如果保存文件时赋窗体属性,由于窗体属性字符串是以PChar类型保存的,直接以string类型指向时就会有问题。
4、楼主的记录中string类型需改成shortstring类型才是可靠的。
 
1.记录类型的结构
type
test = packed record
a: Boolean;
b: Integer;
c: shortstring;//改成
end;
ptest = ^test;
 
如果有一种方法,虽然用edit1.text的值赋给a.c,但转换成字符串常量的形式再赋给a.c,这样存入文件后,就可以正确读出了!问题是长字符串string在delphi中是怎样表示的?
 
用shortstring我就是觉得比较浪费空间,a.c的字符串是不定长的,有的只有几个字符,有的比较长!如果没有其他办法,只得用shortstring了!
 
type
test = packed record
a: Boolean;
b: Integer;
c: string;
end;
ptest = ^test;

function SaveData(const data:test
const filename: string): boolean;
var
Stream: TFileStream;
L : Integer;
begin
Result := true;
try
Stream := TFileStream.Create(filename, fmCreate);
try
Stream.Position := 0;

Stream.Write(Data.A, SizeOf(Data.A));
Stream.Write(Data.B, SizeOf(Data.B));

L := Length(Data.C);
Stream.Write(L, SizeOf(L));
if L > 0 then Stream.Write(Data.C[1], L);
finally
Stream.Free;
end;
except
Result := false
{writing failed}
end;
end;

function LoadData(var data:test
const filename: string): boolean;
var
Stream: TFileStream;
L: Integer;
begin
Result := true;
try
Stream := TFileStream.Create(filename, fmopenread);
try
Stream.Position := 0;
Stream.Read(Data.A, SizeOf(Data.A));
Stream.Read(Data.B, SizeOf(Data.B));

Stream.Read(L, SizeOf(L));
SetLength(Data.c, L);
if L > 0 then Stream.Read(Data.C[1], L);
finally
Stream.Free;
end;
except
Result := false;
end;
end;


//2.将记录存入文件
procedure TForm5.Button1Click(Sender: TObject);
var a:test;
begin
a.b:=1;
a.c:= Edit1.text;//将Edit.text赋给a.c则不行,为什么? //'test';如果用字符串常量则可以
savedata(a,'c:/xzm.txt');
caption:=a.c;
end;

//3.从文件中取记录数据
procedure TForm5.Button2Click(Sender: TObject);
var a:test;
begin
//new(a);
caption:= '';
loaddata(a,'c:/xzm.txt');
caption:=a.c;
end;
 
接受答案!谢谢大家!
 
帮顶!

╭=========================================╮

80G海量源代码,控件,书籍全免费狂下不停!

http://www.source520.com

╰=========================================╯
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
409
import
I
I
回复
0
查看
1K
import
I
I
回复
0
查看
577
import
I
后退
顶部