delphi中操作記錄文件

記錄文件操作方法 

unit DayFreeze;

interface
uses Constants;

//"DayFreeze.dat"
//

Type
   TData_DayFreeze_Type = record

      TN         :  word;    //

      meter_addr :  array[0..5] of Byte;//

      stamp      :  longint;  //

      bReport    :  byte;     //

      config     :  byte;     //

      status     :  word ;    //

      energy     :  longword ;//

end;


type
     TDayFreeze =  array [0..METERNUM-1,0..63] of TData_DayFreeze_Type;

     TDayFreezeFile = File Of TDayFreeze;

     TADayFreezeFile = File Of TData_DayFreeze_Type;

var
     g_fDayFreeze : TDayFreeze;

//接口函數
procedure getDayFreezeDataFromFile(var fDayFreeze : TDayFreeze; filename : string);

function  getDayFreezeDataFromFileEx(filename : string) : integer;

implementation
uses Windows, SysUtils, Global, DateUtils;


//

procedure getDayFreezeDataFromFile(var fDayFreeze : TDayFreeze; filename : string);
var
   fDayFreezeFile : TDayFreezeFile;
begin
   AssignFile(fDayFreezeFile, filename);
   if FileExists(filename) then
   begin
      Reset(fDayFreezeFile);
      try
         Read(fDayFreezeFile, fDayFreeze);
      finally
         CloseFile(fDayFreezeFile);
      end;
   end
end;


//

function getDayFreezeDataFromFileEx(filename : string) : integer;
var
   fADayFreezeFile : TADayFreezeFile;
   fADayFreeze     : TData_DayFreeze_Type;
   i, j : integer;
   pos : Longint;
   count : Longint;
begin
   result := 0;
   count := 0;
   AssignFile(fADayFreezeFile, filename);
   if FileExists(filename) then
   begin
      Reset(fADayFreezeFile);
      count := filesize(fADayFreezeFile);
      i := 0; j := 0;  pos := 0;
      try
         While Not Eof(fADayFreezeFile) do
         begin
             Seek(fADayFreezeFile, result);
             Read(fADayFreezeFile, fADayFreeze);
             CopyMemory(@g_fDayFreeze[i, j], @fADayFreeze, sizeof(TData_DayFreeze_Type));
             inc(j);
             if (j = 64) then
             begin
                 inc(i);
                 j := 0;
             end;
             if (i > METERNUM * 64) then
                 break;
             inc(result);
         end;
      finally
         CloseFile(fADayFreezeFile);
      end;
   end;
   if (count <> result) then
      result := -1;
end;


end.

一種方法就是將所有記錄存放在一個大的緩衝區中,一個read操作就可以將文件中的所有數據都讀出來;如getDayFreezeDataFromFile;

另一種方法就是一條記錄一條記錄的讀,注意到seek的用法,它的第二個參數是以條數爲變量。如getDayFreezeDataFromFileEx;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章