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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.08.2010, 19:37
Клоназепам Клоназепам вне форума
Прохожий
 
Регистрация: 02.08.2010
Сообщения: 2
Репутация: 10
По умолчанию Чтение бинарного (нетипизированного?) файла

Встала такая проблема... Допустим есть файл, который мне надо редактировать, т.е. написать программу для его редактирования. Допустим файл этот содержит информацию о каких-то объектах, и состоит из записей с их параметрами, примерно так:

маркер группы объектов
размер группы объектов в байтах
маркер объекта
размер объекта
маркер параметра объекта
размер параметра объекта
параметр объекта
маркер объекта
размер объекта
маркер параметра объекта
размер параметра объекта
параметр объекта
...ну вы поняли...

короче весь файл состоит из неких строк, у которых есть заголовок, размер и, собственно, содержание, при этом эти сроки вложенные, т.е. содержанием одной строки могут быть другие, которые в свою очередь содержат еще записи

Мне нужен алгоритм чтения этой структуры. Поскольку я в этих делах разве что любитель, прошу вас что-то подсказать по теме.

Еще один важный вопрос: как вообще хранить содержание подобных файлов в памяти, чтобы редактировать его и т.д. даже если есть алгоритм чтения?

Заранее спасибо.
Ответить с цитированием
  #2  
Старый 02.08.2010, 20:14
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ну например такую "плавающую" структуру можно хранить в xml.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 02.08.2010, 20:22
Клоназепам Клоназепам вне форума
Прохожий
 
Регистрация: 02.08.2010
Сообщения: 2
Репутация: 10
По умолчанию

То есть как "хранить"?
Ответить с цитированием
  #4  
Старый 02.08.2010, 20:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Надо сделать коллекцию объектов, которые умеют вычитывать такие штуки (ну и писать, конечно). Читать, писать надо будет через 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;

Как-то так...
Естественно, все это условно и нужна более точная инфо о структуре файла. Ну и если есть желание получить готовый результат, то велкам в раздел "Работа".
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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