Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2011, 13:10   #1
Celestia
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 68
Восклицание Работа с бинарным файлом

Здравствуйте, друзья!
Передо мной встала задача записи нескольких типов данных в один бинарный файл с последующим их чтением.
Сначала нужно записать заголовок в самое начало который будет содержать данные о расположении в бинарнике остальных данных. Вот примерно такой:

Код:
TBinaryHeader = record

  LandscapeMeshOffset: Integer; // смещение начала LandscapeMesh относительно начала бинарника
  LandscapeMeshLen: Integer; // размер LandscapeMesh, байт

  LandscapeMesh2Offset: Integer; // смещение начала LandscapeMesh2 относительно начала бинарника
  LandscapeMesh2Len: Integer; // размер LandscapeMesh2, байт

... и т.п.
end;
Потом записать в бинарник битмапы из переменных в коде.

-----------------------

И потом всё это хозяйство надо считать из бинарника и скормить соответствующим переменным в другом коде -
InLandscapeMesh: TBitmap;
InLandscapeMesh2: TBitmap;

Буду рад любой помощи, спасибо!

ps я хочу разработать свой формат для игровой карты, который будет содержать в себе меши, текстуры, небо и пр.
Celestia вне форума Ответить с цитированием
Старый 17.01.2011, 13:24   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

И для этого нужно обязательно изобретать велосипед со своим уникальным форматом ?
Мало ли существующих контейнерных форматов, влоть до любой подходящей базы данных ?)
mss вне форума Ответить с цитированием
Старый 17.01.2011, 13:36   #3
Celestia
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 68
По умолчанию

Да, я всегда всё своими руками стараюсь делать) Ну и как правило свой велосипед ездит всегда понятнее и правильнее)
Celestia вне форума Ответить с цитированием
Старый 17.01.2011, 13:44   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
И потом всё это хозяйство надо считать из бинарника и скормить соответствующим переменным в другом коде -
Можно записать Битмап в Stream (Посмотри его метод SaveToStream), а потом уже этот Стрим докатать в файл, не забыв вписать его размер перед этим.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.01.2011, 13:49   #5
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> свой велосипед ездит всегда понятнее и правильнее

Судя по твоему вопросу я позволю себе сомневаться в этом.
Ты даже не сподобился конкретизировать способ дальнейшего доступа к контейнеру - то ли последовательный тебе нужен, то ли произвольный индексированный..
А ведь именно от этого в 1-ю очередь зависит "правильность" конструкции будущего велосипеда)

> всё это хозяйство надо считать из бинарника и скормить соответствующим переменным в другом коде

Для этого никакие смещения нафих не нужны.
mss вне форума Ответить с цитированием
Старый 17.01.2011, 14:14   #6
Celestia
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 68
Восклицание

mss, да, я согласен, может я не совсем полно изложил суть.

Собственно говоря, я только начал копать в этом направлении и могу в чём то ошибаться) Мне видится такой общий алгоритм:

Имеем структуру Theader, которая будет содержать позиции и размер битмапов в бинарнике. Также имеем несколько TBitmap.

Запись Bitmap'ов:

1. Пишем пустую структуру THeader в самое начало бинарника
2. Вычисляем размер первого битмапа, пишем его сразу после заголовка
3. Пишем в заголовок смещение и размер первого битмапа
4. Повторяем 2 и 3 для каждого из битмапов, с тем условием что битмапы располагаются один за другим
5. Всё, получился бинарник, допустим map.bin

Чтение Bitmap'ов:

1. Читаем map.bin
2. Читаем заголовок
3. В соответствии с данными с заголовке, грузим в подготовленные переменные битмапы из map.bin

mss, ты говорил о готовых форматах контейнерах- подскажи пожалуйста какие нибудь, может я по их подобию что нибудь напишу)
Celestia вне форума Ответить с цитированием
Старый 17.01.2011, 14:30   #7
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Ну, например, стандартный формат TPF#0, предлагаемый стандартной же delphi streaming system

Практически любой станд.компонент в Делфи УЖЕ научен разработчиками сохранять себя в файловый поток и восставливаться из него.

К примеру, у того же самого TBitmap есть публичные методы LoadFrom/SaveToStream.

Последний раз редактировалось mss; 17.01.2011 в 14:32.
mss вне форума Ответить с цитированием
Старый 17.01.2011, 14:43   #8
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Как вариант извращения (не проверял, но идея где-то такая):
Код:
// Images — объекты TImage в списке tobjectList
// adr — адрес файла

procedure TForm1.Savetofile(Images: tobjectList; adr: String);
var
  i, j: integer;
  fs: TFileStream;
  ms: TMemoryStream;
begin
  fs := TFileStream.Create(adr, fmOpenWrite);

  //в начале запишем кол-во рисунов
  i := Images.Count;
  fs.Write(i, SizeOf(int64));

  try

    // подготовим ложе для "заголовка"
    for i := 0 to Images.Count - 1 do
    begin
      fs.Write(i, SizeOf(int64));
    end;

    ms := TMemoryStream.Create;

    try

      for i := 0 to Images.Count - 1 do
      begin
        // запишем в загаловке где находиться наш рисунок, т.е. положение курсора
        // на данный момент =)
        j:=fs.Position;
        fs.Position := SizeOf(int64) + i * SizeOf(int64);
        fs.Write(j, SizeOf(int64));

        //грузим рисунок с стреам
        ms.Clear;
        TImage(Images[i]).Picture.Bitmap.SaveToStream(ms);

        // грузим из мемори в файлстреам предварительно записав размер =)
        fs.Position := j;
        j := ms.Size;
        fs.Write(j, SizeOf(int64));
        fs.CopyFrom(ms, ms.Size);
      end;

    // покойся с миром =)))
    finally
      ms.Free;
    end;

  finally
    fs.Free;
  end;
end;
Помог? Ну так нажми на весы!

Последний раз редактировалось SNUPY; 17.01.2011 в 14:45.
SNUPY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с бинарным файлом. griba Помощь студентам 4 11.12.2010 13:08
Работа с бинарным файлом (С) madmonk Помощь студентам 4 20.11.2010 20:58
Проблема с бинарным файлом melodeen12 Операционные системы общие вопросы 6 02.08.2010 01:15
работа с бинарным файлом Геннадий Win Api 8 22.10.2009 18:49
работа с бинарным файлом Bayazet Помощь студентам 3 17.03.2009 15:37