怎么读入一个二进制文件并付给一个动态数组? (100分)

  • 主题发起人 主题发起人 yqused
  • 开始时间 开始时间
Y

yqused

Unregistered / Unconfirmed
GUEST, unregistred user!
我要打开一个比较大的文件(16M)然后将它的数据赋给提供动态数组(大小为文件的大小,关键是速度要快。因为我要对文件进行修改,要经常使用文件中的某些数据)。请给出较详细的代码(我是初学者),谢谢各位大侠!!!
 
你的意思是不是要生成一个与文件字节数同样大小的数组,然后对应的把每个字节的数据赋到数组中去
 
是的,就是这个意思(关键是速度要快哦,不能一个字节一个字节的赋值哦)!!!请大侠赐教!!!
 
也不用一下全读进去吧,太大了,
而且一定要用动态数组吗?
 
你把文件读入流中不行吗?
流本身就提供定位,修改等函数啊
mstr:TMemoryStream;
mstr:=TMemoryStream.create();
mstr.loadfromfile();
mstr.position:==;
mstr.seek()……
 
是不是有是操作DBF表啊。
 
同意 落木潇潇,用流读取,再根据需要定位
一下子读到数组中太大了
 
procedure TForm1.Button1Click(Sender: TObject);
var
ArrayOfFile : array of char;
ArrayBound : Integer;
FileHandle : THandle;
begin
FileHandle := FileOpen('c:/a.bin', fmOpenReadWrite);
if FileHandle = 0 then
begin
ShowMessage('打开失败');
Exit;
end;
ArrayBound := GetFileSize(FileHandle, nil);
SetLength(ArrayOfFile, ArrayBound);
FileRead(FileHandle, ArrayOfFile[0], Length(ArrayOfFile));
FileClose(FileHandle);
end;
 
用多线程分块读取,就是多线程下载一样
 
多线程也不是万能的。
象微软的复合文档就作得很好。[^]
 
花了一周的时间刚做完“西门子交换机AMA格式文件”转换工具,今天老总开会时却说不要了。晕。。。

yqused提的问题,我在做这个工具时也碰到过,且在这之前分析过“FastReport2.4”的文件格式,对二进制文件的读操作有点经验,现在贴出部分代码,希望对大家有所帮助。

{
********************************************************
函数名 : GetStrByLength
功能 : 打开源文件FName, 并将结果输出到目标文件FDestName
参数 : AFName 源文件名
: ALong 长度
: strOut 字串内容

返回 : 真:找到源文件
假:没找到源文件
********************************************************
}
function GetStrByLength(AFName : String; ALong: Integer; var strOut: String): Boolean;
var
Stream: TFileStream;
F: TextFile;
begin
Result := FileExists(AFName);
if Result then
begin
Stream := TFileStream.Create(AFName,fmOpenRead);
try
SetLength(strOut, ALong);
Stream.Read(strOut[1], Along);
finally
Stream.Free;
end;
end;
end;
 
多人接受答案了。
 
后退
顶部