![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#12
|
|||
|
|||
![]() А поиском по форуму пройтись? Недавно был подобный вопрос.
Делается это через нетипизированные файлы, через 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; |