Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #12  
Старый 25.10.2010, 20:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,107
Версия 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;
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:37.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025