![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Встала такая проблема... Допустим есть файл, который мне надо редактировать, т.е. написать программу для его редактирования. Допустим файл этот содержит информацию о каких-то объектах, и состоит из записей с их параметрами, примерно так:
маркер группы объектов размер группы объектов в байтах маркер объекта размер объекта маркер параметра объекта размер параметра объекта параметр объекта маркер объекта размер объекта маркер параметра объекта размер параметра объекта параметр объекта ...ну вы поняли... короче весь файл состоит из неких строк, у которых есть заголовок, размер и, собственно, содержание, при этом эти сроки вложенные, т.е. содержанием одной строки могут быть другие, которые в свою очередь содержат еще записи Мне нужен алгоритм чтения этой структуры. Поскольку я в этих делах разве что любитель, прошу вас что-то подсказать по теме. Еще один важный вопрос: как вообще хранить содержание подобных файлов в памяти, чтобы редактировать его и т.д. даже если есть алгоритм чтения? Заранее спасибо. |
#2
|
||||
|
||||
![]() Ну например такую "плавающую" структуру можно хранить в xml.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
![]() То есть как "хранить"?
|
#4
|
|||
|
|||
![]() Надо сделать коллекцию объектов, которые умеют вычитывать такие штуки (ну и писать, конечно). Читать, писать надо будет через TStream.
Набросок вот: Код:
type // Базовые классы. TBase = class public procedure Read(AStream : TStream); virtual; abstract; procedure Write(AStream : TStream); virtual; abstract; end; TBaseList = class(TBase) private FItems : TObjectList; public procedure Clear; procedure Add(ABase : TBase); virtual; abstract; procedure Remove(ABase : TBase); virtual; abstract; procedure Delete(Index : Integer); virtual; abstract; property Count : Integer read GetCount; end; // Параметр TParam = class(TBase) private FValue : PChar; FSize : Integer; public property Value : PChar read FValue write SetValue; end; // Оъект. Имя TObject уже зарезервированно, так что... TFileObject = class(TBaseList) public procedure Add(ABase : TBase); override; procedure Remove(ABase : TBase); override; procedure Delete(Index : Integer); override; property Items[Index : Integer] : TParam read GetItem; end; // Группа объектов TGroup = class(TBase) public procedure Read(AStream : TStream); override; procedure Write(AStream : TStream); override; property Items[Index : Integer] : TFileClass read GetItem; end; // Ридер/райтер файла TBinFile = class private FItems : TObjects; public procedure LoadFromFile(AFileName : String); procedure SaveToFile(AFileName : String); property Items[Index : Integer] : TGroup read GetItem; property Count : Integer read GetCount; end; imlementation procedure TBinFile.LoadFromFile(AFileName : String); var AStream : TFileStream; ASig : Integer; // Маркер ASize : Integer; // Размер AEndBlock : Int64; AGroup : TGroup; begin AStream := TFileStream.Create(AFileName,fmOpenRead); Try While AStream.Position <> AStream.Size Do Begin AStream.ReadBuffer(ASig,SizeOf(Integer)); AStream.ReadBuffer(ASize,SizeOf(Integer)); If ASig = 12345 Then // Если это группа объектов Begin AEndBlock := AStream.Position + ASize; While AStream.Position <> AEndBlock Do Begin AGroup := TGroup.Create; AGroup.Read(AStream); FItems.Add(AGroup); End; End; End; Finally AStream.Free; End; end; Как-то так... Естественно, все это условно и нужна более точная инфо о структуре файла. Ну и если есть желание получить готовый результат, то велкам в раздел "Работа". |