![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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;Как-то так... Естественно, все это условно и нужна более точная инфо о структуре файла. Ну и если есть желание получить готовый результат, то велкам в раздел "Работа". |