记录文件操作方法
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;