![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| insidex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 23.11.2006 Репутация: нет Всего: нет |
Вроде бы детский вопрос, но я не знаю размер структуры, которой как я понял динамически память выделяется, и соответственно не могу её в (char *) первести для записи в файл. Может кто знает, как решать проблему...
Вот оно:
Вот эту херуимевну мне надо сохранить на диск, а потом еще и считать как структуру...Вообще возможно?? |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Возможно. Запись структуры в файл осуществляется последовательной записью всех подструктур в файл. Выясни всю информацию про подструктуры (то бишь, про все поля - статическое пишется напрямую, динамическое - хитрее) и дело в шляпе. |
|||
|
||||
| insidex |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 23.11.2006 Репутация: нет Всего: нет |
а если оно динамическое, как мне узнать сколько оно памяти занимает? то есть такой вариант бессмысленен:
Это сообщение отредактировал(а) insidex - 6.11.2007, 18:13 |
||||
|
|||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Нет. Но sizeof, к примеру включит в результирующий размер размеры указателей, но не размеры того на что они указывают. Так что, всё таки придётся немного попотеть -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
я в таком случае (на С++) писал у каждого класса (и подкласса) функции GetRawData. Получалось именно что-то типа рекурсии. Функция GetRawData или добавляла по очереди в поток или примитивные данные-члены или результат функции GetRawData от подклассов-членов.
на чистых сях все выглядит (по мне) сложнее, но логика туда-же |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
А лучше написать wrapper'ы(если нужно поддерживать POD'овость структур) и прикрутить к ним boost::serialization
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
archimed7592, вот потому я и хочу прочесть книгу по бусту (как время появится). потому что всех его возможностей не знаю.
|
|||
|
||||
| insidex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 23.11.2006 Репутация: нет Всего: нет |
хех задачка не для слабонервных
|
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Одной строчкой -- невозможно. Придётся явно написать код сохранения каждого элемента структуры. При этом нужно ещё откуда-то знать длины тех объектов, на которые ссылаются указатели. То есть, нужно либо понимать устройство структуры, если длины хранятся в ней, либо знать это откуда-то ещё.
Дело в том, что Си/Си++ сам не хранит информацию о длине массивов. Можно немного упростить себе задачу. Написать "тупой" код, который сохраняет всю структуру. При этом на тех местах в файле, которым соответствуют члены с указателями, будет бред (адреса памяти, которые к моменту считывания будут недействительными). Затем, отдельно дописать после структуры все объекты, на которые ссылаются её указатели. При чтении поступить обратно. Сперва считать структуру. Сразу после этого нельзя будет пользоваться членами с указателями, так как там будет бред. Затем ПРАВИЛЬНО считать другие объекты после структуры, разместить их в памяти и в конце заполнить указатели исходной структуры правильными адресами. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |