Простая запись чтения/записи.файл dat в Delphi

по какой-то причине моя учетная запись OpenID больше не существует, даже когда я использовал ее вчера. Но все равно.

Мне нужно сохранить данные записи в a .файл dat. Я пробовал много искать, но все это было связано с базами данных и BLOB-объектами. Я ничего не смог из него построить.

У меня есть следующие записи

   type
   Scores = record
     name: string[50];
     score: integer;
   end;  

var rank: array[1..3] of scores;

Мне просто нужен простой способ сохранения и чтения данных из .файл dat. У меня была книга о том, как это сделать, но это в школа.

3 ответов


вы также должны взглянуть на file of-метод.

Это немного устаревшей, но это хороший способ научиться работать с файлами.

поскольку записи с динамическими массивами (включая обычные строки) не могут быть сохранены в файлах с помощью этого метода, строки unicode не будут поддерживаться. Но!--3--> базируется на ShortStrings и ваша запись поэтому уже в юникоде...

пишите файл

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; 

использовать потоки. Вот простая демонстрация (просто демонстрация - на практике нет необходимости открывать файловый поток каждый раз):

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;

посмотрите в справке в разделе " blockread "и"blockwrite". Вероятно, будет пример