![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; |