簡體   English   中英

在Delphi中簡單的讀/寫記錄.dat文件

[英]Simple read/write record .dat file in Delphi

由於某些原因,即使昨天使用我的OpenID帳戶也不再存在。 但無論如何。

我需要將記錄數據保存到.dat文件中。 我嘗試了很多搜索,但都與數據庫和BLOB有關。 我無法從中構造任何東西。

我有以下記錄

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

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

我只需要一種簡單的方法來保存和讀取.dat文件中的記錄數據。 我有一本關於如何做的書,但是那是在學校。

您還應該查看-method的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; 

使用流。 這是一個簡單的演示(只是演示-實際上,不需要每次都重新打開文件流):

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”下查看幫助。 可能會有一個例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM