Показать сообщение отдельно
  #12  
Старый 25.10.2010, 20:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,100
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А поиском по форуму пройтись? Недавно был подобный вопрос.
Делается это через нетипизированные файлы, через 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;
Ответить с цитированием