出于某种原因,即使我昨天使用它,我的OpenID帐户也不再存在。但无论如何。
我需要将记录数据保存到.dat文件中。我尝试了很多搜索,但它都与数据库和BLOB有关。我无法从中构建任何东西。
我有以下记录
type
Scores = record
name: string[50];
score: integer;
end;
var rank: array[1..3] of scores;
我只需要一种简单的方法来保存和读取.dat文件中的记录数据。我有关于如何做的书,但那是在学校。
答案 0 :(得分:12)
您还应该查看file of
- 方法。
这有点过时,但这是了解如何使用文件的好方法。
由于使用此方法无法将包含动态数组(包括普通字符串)的记录存储到文件中,因此不支持unicode字符串。但string[50]
基于ShortStrings,因此您的记录已经是非unicode ...
写入文件
var
i: Integer;
myFile: File of TScores;
begin
AssignFile(myFile,'Rank.dat');
Rewrite(myFile);
try
for i := 1 to 3 do
Write(myFile, Rank[i]);
finally
CloseFile(myFile);
end;
end;
从文件中读取
var
i: Integer;
Scores: TScores;
myFile: File of TScores;
begin
AssignFile(myFile, 'Rank.dat');
Reset(myFile);
try
i := 1;
while not EOF(myFile) do
begin
Read(myFile, Scores);
Rank[i] := Scores; //You will get an error if i is out of the array bounds. I.e. more than 3
Inc(i);
end;
finally
CloseFile(myFile);
end;
end;
答案 1 :(得分:4)
使用流。这是一个简单的演示(只是演示 - 实际上每次都不需要重新打开文件流):
type
Scores = record
name: string[50];
score: integer;
end;
var rank: array[1..3] of scores;
procedure WriteScores(var Buf; Count: Integer);
var
Stream: TStream;
begin
Stream:= TFileStream.Create('test.dat', fmCreate);
try
Stream.WriteBuffer(Buf, SizeOf(Scores) * Count);
finally
Stream.Free;
end;
end;
procedure ReadScore(var Buf; Index: Integer);
var
Stream: TStream;
begin
Stream:= TFileStream.Create('test.dat', fmOpenRead or fmShareDenyWrite);
try
Stream.Position:= Index * SizeOf(Scores);
Stream.ReadBuffer(Buf, SizeOf(Scores));
finally
Stream.Free;
end;
end;
// write rank[1..3] to test.dat
procedure TForm1.Button1Click(Sender: TObject);
begin
rank[2].name:= '123';
WriteScores(rank, Length(Rank));
end;
// read rank[2] from test.dat
procedure TForm1.Button2Click(Sender: TObject);
begin
rank[2].name:= '';
ReadScore(rank[2], 2 - Low(rank));
ShowMessage(rank[2].name);
end;
答案 2 :(得分:1)
查看“blockread”和/或“blockwrite”下的帮助。可能会有一个例子