关于数组保存为文件的问题(100分)

  • 主题发起人 主题发起人 山药蛋
  • 开始时间 开始时间

山药蛋

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个数组:MyData:array[0..511] of Integer;
数值大概是0..4096.
怎么保存为文件?要求是读入和写出的速度尽量快。
如果是double型的呢?
 
试试这个,比较简单的一种方法:
with TStringList.Create do
try
for i := 0 to 511 do
begin
Add(Format('%D', [MyData]));
end;
SaveToFile('FileName');
finally
Free;
end;

with TStringList.Create do
try
LoadFromFile('FileName');
for i := 0 to 511 do
begin
MyData := StrToIntDef(Strings, -1);
end;
finally
Free;
end;
 
给你两个函数,这两个函数可以对付绝大部分数据的储存。

unit FileUnit;

interface

uses Windows, Classes, SysUtils, Dialogs;

type
PDataStru = ^TDataStru;
TDataStru = record
// 这里为你想要的数据类型
end;

procedure ReadDataFile(Filename: string
DataList: TList);
procedure SaveDataFile(Filename: string
DataList: TList);

implementation

procedure ReadDataFile(Filename: string
DataList: TList);
var
PData: PDataStru;
Buf: array[0..BufSize] of byte
//BufSize 是你的数据类型结构的大小多一点
DataFile: HFile;
ReadNumber: LongWord;
FileSize: DWORD;
StruSize: DWORD;
FilePos: DWORD;
begin
if not fileexists(Filename) then
begin
//showmessage('File is not exists.');
exit;
end;
DataFile := CreateFile(PChar(FileName), GENERIC_READ,
0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if DataFile = 0 then
begin
showmessage('Read file error.');
exit;
end;
FileSize := GetFileSize(DataFile, nil);
StruSize := SizeOf(TDataStru);
DataList.Clear;
FilePos := SetFilePointer(DataFile, 0, nil, FILE_CURRENT);
while (FilePos < FileSize) do
begin
new(PData);
ReadFile(DataFile, Buf, StruSize, ReadNumber, nil);
FilePos := SetFilePointer(DataFile, 0, nil, FILE_CURRENT);
CopyMemory(PData, @Buf, StruSize);
if (StruSize <> ReadNumber) then
break;
if PData = nil then continue;
DataList.Add(PData);
end;
CloseHandle(DataFile);
end;

procedure SaveDataFile(Filename: string
DataList: TList);
var
i: integer;
DataFile: HFile;
WriteNumber: LongWord;
StruSize: DWORD;
begin
DataFile := CreateFile(PChar(FileName), GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if DataFile = 0 then
begin
showmessage('Write file error.');
exit;
end;
StruSize := SizeOf(TDataStru);
SetFilePointer(DataFile, 0, nil, FILE_BEGIN);
for i := 0 to DataList.Count - 1 do
begin
WriteFile(DataFile, DataList^, StruSize, WriteNumber, nil);
if (StruSize <> WriteNumber) then
break;
end;
CloseHandle(DataFile);
end;

end.
 
用Tstream,很方便,我的程序保存5M的 Record of array就是用的它,读存方便块捷
 
感谢各位的帮助,我知道以上方法都是可行的,但现在想要一个执行速度最快的方法。
因为文件要以这个数组为单位进行读写,数据类型不复杂,但读写很频繁,最后
这个文件也会很大,估计会上百M,这时候文件的定位速度怕会影响到程序的响应速度了。
不知道文件读写的方法里,哪个方法是最快的?
 
上面的是最基本的文件读写方法,基本上是一定要用到的,你用其他的API的话也差不多,
你想提高速度的话可以把文件分块,然后开辟内存把文件拷贝到内存中进行操作。
 
多人接受答案了。
 
后退
顶部