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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.09.2011, 00:45
SergArmy SergArmy вне форума
Прохожий
 
Регистрация: 28.08.2011
Сообщения: 18
Репутация: 10
По умолчанию Как представлены данные в типизированных файлах?

Доброго времени суток!

у меня возник такой вопрос - как представлена информация в типизированных файлах?

поясню:

Программа создает файл согласно описанной структуре:
Код:
Type
  typeRaiting = 0..10;
  
  typeCover = record
    Pic   : array [0..RAZMER_BYTE] of  Byte;      
    Size  : Integer;                              
  end;

  typeFilms=record
    Name,
    Country,
    Genre,
    Producer,
    FilmCompany     : String[60];
    Description     : String[255];
    BoxOffice,
    Year            : Integer;
    PersonalRating  : typeRaiting;
    Cover           : typeCover;
    FileLocation    : String[255];
  end;

typeFilms - это и есть структура одной записи файла.

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

Объясните пожалуйста !
Или укажите ЧТО мозно почитать по поводу этого?
Ответить с цитированием
  #2  
Старый 30.09.2011, 06:20
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Данные записываются в бинарном виде.
Ограниченны размером структуры, т.е. никакого ограничения, в принципе, нет.
Ответить с цитированием
  #3  
Старый 30.09.2011, 09:43
SergArmy SergArmy вне форума
Прохожий
 
Регистрация: 28.08.2011
Сообщения: 18
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Данные записываются в бинарном виде.
Ограниченны размером структуры, т.е. никакого ограничения, в принципе, нет.

Т.е. если размер первой записи равен 60 символов, то в файл сохраняется 60 байт потом следующая, следующая и так далее пока полностью не записана все данные, потом переходим к следующей записи ...
Если одна запись равна 1000 байт, то что бы обратится к 7 - программа начинает считывать с 7000-го байта?
Ответить с цитированием
  #4  
Старый 30.09.2011, 12:48
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

С небольшим уточнением, если не указано packed в записи, и в ней имеются данные разных величин (Byte, Word, DWORD), они будут выравнены в максимальную сторону.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 30.09.2011, 15:06
SergArmy SergArmy вне форума
Прохожий
 
Регистрация: 28.08.2011
Сообщения: 18
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
С небольшим уточнением, если не указано packed в записи, и в ней имеются данные разных величин (Byte, Word, DWORD), они будут выравнены в максимальную сторону.

Не совсем понял, если не сложно по подробнее! Пожалуйста!
Ответить с цитированием
  #6  
Старый 30.09.2011, 16:16
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
Сообщение от SergArmy
Если одна запись равна 1000 байт, то что бы обратится к 7 - программа начинает считывать с 7000-го байта?
Да

Цитата:
Сообщение от SergArmy
Не совсем понял, если не сложно по подробнее! Пожалуйста!

Имеется ввиду, что реальный размер Record`а может быть больше, чем сумма размеров его частей, если не указано packed.
Архитектура x86 позволяет считывать данные с любого адреса, но вообще говоря, адреса переменных(и полей записи) типа word должны быть чётными, адреса переменных типа DWord и Single должны делиться на четыре, адреса переменных типа Int64 и Double должны делиться на восемь. И компилятор может вставлять в запись дополнительные безымянные поля для выполнения этого.
Ответить с цитированием
  #7  
Старый 01.10.2011, 21:13
SergArmy SergArmy вне форума
Прохожий
 
Регистрация: 28.08.2011
Сообщения: 18
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Да



Имеется ввиду, что реальный размер Record`а может быть больше, чем сумма размеров его частей, если не указано packed.
Архитектура x86 позволяет считывать данные с любого адреса, но вообще говоря, адреса переменных(и полей записи) типа word должны быть чётными, адреса переменных типа DWord и Single должны делиться на четыре, адреса переменных типа Int64 и Double должны делиться на восемь. И компилятор может вставлять в запись дополнительные безымянные поля для выполнения этого.

Огромное спасибо, очень развернуто и понятно!

Всем остальным так же СПАСИБО!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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