Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.06.10;
Скачать: [xml.tar.bz2];

Вниз

Запись структуры в файл   Найти похожие ветки 

 
Бергамот   (2007-05-22 15:17) [0]

Здравствуйте! Такая проблема. Есть струтура, скажем

type
Myclass = record
  a,b:char;
  c,d:integer;
  stext:string
end;

Мне это все нуно записать в файл. Делаю так
var
buffer:myclass;
...
stream:=tfilestem.create(путь,режим);
stream.write(buffer,sizeof(buffer));
sream.free

Пишет, но до stext. А дальше крякозябры.

Если так

stext:array [0..5] of char;
...

buffer.stext:="123456";

Все работает. Но мне нужно чтоб я мог произвольно изменить длину stext. Динамические массивы также идут лесом вместе с string. Разбираю формат одного файла, так там это решено использованием какого-то типа, который перед записью ставит информацию о длине, в размере четырех байт (например A0 00 00 00 <запись длиной в 10 байт>). Что это может быть за тип или как реаллизовать подобное поведение. Мне нужно именно в составе выше означенной структуре.


 
Сергей М. ©   (2007-05-22 15:24) [1]


> там это решено использованием какого-то типа, который перед
> записью ставит информацию о длине, в размере четырех байт


Все верно, и тебе нужно именно так поступать.


> Что это может быть за тип


Integer


 
Desdechado ©   (2007-05-22 15:32) [2]

> Но мне нужно чтоб я мог произвольно изменить длину stext.
Тогда у тебя не типизированный файл получается, а бестиповый. Типизированный требует наличие фиксированной длины типа.

sizeof(buffer) дает длину самой записи, а String - это указатель (те самые 4 байта кракозябр) на место в памяти.


 
Бергамот   (2007-05-22 15:35) [3]

Все верно, и тебе нужно именно так поступать.

> Что это может быть за тип

Integer

Это я и так понял. Можно ввести подструктуру.
Например

type
Tpodst = record
size:integer;
text://незнаю что, например статистический массив char
end;

Но остается проблема с произвольной длиной записи.


 
Бергамот   (2007-05-22 15:38) [4]

sizeof(buffer) дает длину самой записи, а String - это указатель (те самые 4 байта кракозябр) на место в памяти.

Тоже понятно, как и pchar. Суть проблемы описал в [2]. Как можно решить?


 
Сергей М. ©   (2007-05-22 15:43) [5]


> Как можно решить?


При требованиях к типизированности файла - никак.

Или отказывайся от типизированности или фикируй длину строки. Третьего не дано.


 
Бергамот   (2007-05-22 15:46) [6]

Тогда у тебя не типизированный файл получается, а бестиповый. Типизированный требует наличие фиксированной длины типа.

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


 
Бергамот   (2007-05-22 15:49) [7]

Или отказывайся от типизированности или фикируй длину строки. Третьего не дано.

А через динамические массивы, как-нибуть может пролезть?


 
Правильный Вася   (2007-05-22 15:50) [8]


> через динамические массивы

массивы чего?


 
umbra ©   (2007-05-22 15:55) [9]


> какимто образом сделана изменяемая длина записи.

можно, например, писать перед каждой записью ее размер, далее саму запись. И читать потом, соответственно, сначала размер, потом саму запись.


 
Плохиш ©   (2007-05-22 15:56) [10]


> Бергамот   (22.05.07 15:46) [6]
> То-то и оно в том файле явно просматривается типизированый тип,

Глупость. Файл это последовательный набор байтов, а интерпретация этого набора целиком лежит на совести воспалённого мозга программиста. Если ты запишешь все поля своей записи поочереди в файл, а строку в виде <длина><данные>, то у тебя будет "явно просматривается типизированый тип"


 
Бергамот   (2007-05-22 16:01) [11]

Глупость. Файл это последовательный набор байтов, а интерпретация этого набора целиком лежит на совести воспалённого мозга программиста. Если ты запишешь все поля своей записи поочереди в файл, а строку в виде <длина><данные>, то у тебя будет "явно просматривается типизированый тип"

:0)

Ладно всем спасибо. Схитрить хотел. Повидимому придется побайтно разбирать.


 
Amoeba ©   (2007-05-22 16:09) [12]


> Повидимому придется побайтно разбирать.

Флаг в руки и барабан на шею! Если не хочешь отказаться от типизированного файла и последовать umbra ©   (22.05.07 15:55) [9], или же вместо длинной строки в записи использовать короткую.


 
Плохиш ©   (2007-05-22 16:46) [13]


> Amoeba ©   (22.05.07 16:09) [12]


> последовать umbra ©   (22.05.07 15:55) [9]

И как это позволит записать записи с полями типа длиной строки или динамического массива?
Всё-равно эти поля придётся отдельно писать...


 
Amoeba ©   (2007-05-22 17:04) [14]


> И как это позволит записать записи с полями типа длиной
> строки или динамического массива?
> Всё-равно эти поля придётся отдельно писать...
>

Это и имелось в виду, что строковые поля записывать отдельно, после всех нестроковых.


 
Сергей М. ©   (2007-05-22 17:11) [15]


> Бергамот   (22.05.07 16:01) [11]


> Повидимому придется побайтно разбирать


Если не требуется рандомный доступ к элементам массива "структур", хранящихся в файле, то изобретать велосипед вовсе не требуется.
Достаточно использовать вместо структуры класс-наследник TComponent, Борланд "научил" этот класс автоматически сохранять свои опубликованные св-ва (в т.ч. String) в стрим для последующего автоматическтго восстановления.

см. TStream.WriteComponent[Res]


 
Бергамот   (2007-05-22 19:32) [16]


> Amoeba ©   (22.05.07 16:09) [12]
> Если не хочешь отказаться от типизированного файла и последовать
> umbra ©   (22.05.07 15:55) [9]
>
> Бергамот   (22.05.07 16:01) [11]


Собственно так я и собирался поступить, так и было сделано, пока все исходники вместе с виндой не грохнул


 
Anatoly Podgoretsky ©   (2007-05-22 19:34) [17]

> Бергамот  (22.05.2007 19:32:16)  [16]

Бог с ней с виндой, но хоть бы исходники оставил.


 
Бергамот   (2007-05-22 19:39) [18]


> но хоть бы исходники оставил

Забыл, что по умолчанию они на диске "С" живут ))



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.06.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.063 c
2-1179691680
ppcumax
2007-05-21 00:08
2007.06.10
Вопрос о WebBrowser


1-1175756753
kyn66
2007-04-05 11:05
2007.06.10
Это странное событие BGridEhSumListAfterRecalcAll


2-1179550178
tetris
2007-05-19 08:49
2007.06.10
Что такое "секретный диск",?


2-1179409650
Тимоха
2007-05-17 17:47
2007.06.10
цвет в итеме


9-1153207029
Lam3r
2006-07-18 11:17
2007.06.10
DirectX обучение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский