А поиском по форуму пройтись? Недавно был подобный вопрос.
Делается это через нетипизированные файлы, через TFileStream.
Для более точного ответа нужно знать точную структуру блоков в файле.
Вообще, обычно для работы с такими данными/файлами пишут набор классов, которые собственно и реализуют работу с файлом и хранение данных в момент выполнения программы.
Однако, если тебе надо только читать, причем не весь файл, а какие-то определенные части, то действительно, можно сделать специальный читатель, который просто пропустит ненужные данные и считает только то, что нужно.
Теперь по существу.
1. Тебе надо сделать структуры для чтения заголовков разных типов.
2. Теперь надо открыть файловый поток и считывать данные. Данный класс сам обеспечит кеширование и др. Кстати, тогда можно все-таки попробовать читать в динамический массив.
Код:
type
TFileHeader = record
Traces : DWORD;
AnyParams : DWORD; // какие-то параметры
end;
TTraceHeader = record
Values : DWORD;
AnyParams : DWORD; // какие-то параметры
end;
TTraceData = Array of DWORD; // не знаю какого типа у тебя там данные.
TTracePair = record // Для удобства хранения
Hdr : TTraceHeader;
Data : TTraceData;
end;
TData = class
FFileHeader : TFileHeader;
FTraces : Array Of TTracePair;
procedure ReadFromFile(AFileName : String);
end;
procedure TData.ReadFromFile(AFileName : String);
var
F : TFileStream;
begin
F := TFileStream.Create(AFileName,fmOpenRead);
Try
F.ReadBuffer(FFileHeader,SizeOf(TTraceHeader));
SetLength(FTraces, FFileHeader.Traces);
For I := 0 To FFileHeader.Traces-1 Do
Begin
F.ReadBuffer(FTraces[i].Hdr,SizeOf(TTraceHeader));
SetLength(FTraces[i].Data,FTraces[i].Hdr.Values);
F.ReadBuffer(FTraces[i].Data[0],SizeOf(DWORD) * FTraces[i].Hdr.Values); // Здесь тип должен соотв. данным
End;
Finally
F.Free;
End;
end;