记录类型如何存储到文本文件?(20分)

  • 主题发起人 主题发起人 lcl_003
  • 开始时间 开始时间
L

lcl_003

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一些记录比如:姓名,年龄,性别,生日。想存入文本文件,我现在是一行一行存的,
就是这样:
姓名1
年龄1
性别1
生日1
姓名2
年龄2
性别2
生日2




然后读出的时候在依次读出付给变量。由于记录很多就得数哪行对应哪个记录,很烦。
看书知道有记录类型很方便,应该可以将存贮成

姓名1,年龄1,性别1,生日1
姓名2,年龄2,性别2,生日2
这样就方便多了,那位帮忙写个存储和读出的例子?
多谢
 
象DFM那样存啊,一个一个元素存,没办法,我就是那样存的。
 
有一个叫 TextTable 的控件可以实现你的要求,那是个从 TDataSet 继承下来的数据表控件,
不过,如果不涉及数据库一类的东西,我个人认为自己做段程序来保存也许更方便点,或者用
INI 文件的形式保存也可以的。
 
用TStrings可以帮你完成这个
 
说详细点好吗
 
如果嫌写文件麻烦的话,可以用listbox来实现
listbox.loadfromfile(你的文件)
for i:=0 to listbox.items.count-1 do
begin
if i%4<>0
ss1:=ss1+listbox.items.text
else
memo1.line.add(ss1)
end;

然后将memo1.savetofile(新文件)
这是随后写了,但这个思路是可以解决问题的
 
使用分隔符吧,例如:
const
cSpliter = '|';
type
PMyDataStru = ^TMyDataStru;
TMyDataStru = record
Name: String[50];
Age: Integer;
Sex: Boolean;
Birthday: String[10]; // 我不知道是否是 TDateTime
end;
...
// 下面程序没有加入容错的,请自己斟酌
procedure GetMyDataFromFile(const FileName: String; DataList: TList);
var
F: TextFile;
P: PMyDataStru;
S: ShortString;
ps: PShortString;
X, Y: Integer;

procedure GetNext;
begin
Ps:= @Ps^[X];
Dec(Y, X);
PByte(Ps)^:= Y;

X:= Pos(cSpliter, Ps^);
PByte(Ps)^:= X - 1;
end;

begin
AssignFile(F, FileName);
Reset(F);
while not eof(F) do begin
New(P);
Readln(F, S); X:= 0; Y:= Length(S);
GetNext; P^.Name:= Ps^;
GetNext; P^.Age:= StrToInt(Ps^);
GetNext; P^.Sex:= (upcase(Ps^[1]) = 'M');
GetNext; P^.Birthday:= Ps^;
DataList.Add(P);
end;
CloseFile(F);
end;

procedure SaveMyDataToFile(const FileName: String; DataList: TList);
var
F: TextFile;
P: PMyDataStru;
S: ShortString;
I: Integer;
begin
AssignFile(F, FileName);
Rewrite(F);
for I:= 0 to DataList.Count - 1 do begin
P:= PMyDataStru(DataList);
S:= P^.Name + cSpliter + IntToStr(P^.Age) + cSpliter;
if P^.Sex then S:= S + 'M' else S:= S + 'F';
S:= S + cSpliter + P^.Birthday + cSpliter;
Writeln(F, S);
end;
CloseFile(F);
end;
 
这个以前在大学里学pascal时就会了,而且是经常用的。

type
TMyRecord = record
name: string[20];
age: integer;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
abc: file of TMyRecord;
a : TMyRecord;
i: integer;
begin
Randomize;

AssignFile(abc, 'e:/temp/record.dat');
rewrite(abc);
for i:=1 to 10 do begin
a.name := IntToStr(Random(10));
a.age := Random(100);
write(abc, a);
end;
CloseFile(abc);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
abc: file of TMyRecord;
a : TMyRecord;
begin
AssignFile(abc, 'e:/temp/record.dat');
ReSet(abc);
while not eof(abc) do begin
read(abc, a);
memo1.Lines.Add(a.name+' '+IntTostr(a.age));
end;
CloseFile(abc);
end;
 
快给钱吧,问题已经解决了!
 
用TFileStream就行
MyFile := TFileStream.Create(....);
MyFile.Write(YouRecord,SizeOf(TYouRecord));
MyFile.Free;
 
多人接受答案了。
 
后退
顶部