![]() |
|
Модераторы: bsa |
![]()
|
|
| Compositum |
|
|||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Доброго времени суток.
Потихоньку изучаю C, если точнее - стандарт ISO/IEC 9899:1990. Когда я ранее писал код на C#, то особо не задумывался о том, как сохранять в файлах состояния различных объектов (сериализация всё делала за меня), а вот в C... Я понимаю, как сохранить в файл массивы структур, содержащих в себе поля базовых типов (int, char, double и т.п.), и как прочитать их обратно, однако в более сложной ситуации возникает заминка... Как правильно сохранять в файл структуры данных, связанных друг с другом посредством указателей, чтобы затем можно было бы прочитать данные обратно из файла, корректно восстановив все связи? Спасибо |
|||
|
||||
| rrrFer |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: 0 Всего: 1 |
Думаю самый простой вариант добица чего Вам надо использовать БД типа SQLite: http://www.sqlite.org/ .
Сериализация указателей...хм, не представляю ) |
|||
|
||||
| Compositum |
|
|||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Предположим, Вам нужно в двоичном файле хранить некоторое двоичное дерево и пару списков (односвязный и двусвязный), без всяких СУБД. Как реализуете это своими силами?
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Есть некоторое количество библиотек для сериализации, правда они в основном для С++. В частности есть соотвествующий пакет в boost'е
В любом случае сериализация (как в С++ так и в чистом С) потребует яных действий со стороны программиста, автомат увы не получится |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
не думаю, что хорошая мысль хранить данные в том же формате, в котором они хранятся в памяти, скорости от этого не выиграть, а проблемы получить можно..
если нужно сериализовать список, то достаточно слить элементы списка в файл (двоичный, текстовый - не важно), а затем при восстановлении использовать стандартные средства добавления в список.. Это сообщение отредактировал(а) fish9370 - 5.4.2013, 10:20 -------------------- undefined |
|||
|
||||
| dershokus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 7.8.2011 Репутация: нет Всего: 1 |
Сохранять в файл список, я считаю, лучше всего немного изменив структуру элемента списка т.е.
* Записывать данные в правильном порядке т.е. первым идет корень, вторым от него левый узел и третьим - правый. Всегда можно придумать другую модель для конкретного дерева/структуры. * Записывать данные по указателям сразу за данными узла дерева (тоесть есть структура узла и данные {к примеру структура ИФО}. Таким образом ну нужно будет востанавливать связи узел-данные. Все это для того, чтобы восстановить указатели (которые записывать смысла нет). Вот как-то так Это сообщение отредактировал(а) dershokus - 5.4.2013, 10:37 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Двоичное дерево укладывается в массив безо всяких указателей, поэтому в файле его сохранить очень просто.
Что касается указателей вообще, их значения можно сохранять в файле, а объекты на которые они указывают предварять полем id со значением указателя |
|||
|
||||
| dershokus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 7.8.2011 Репутация: нет Всего: 1 |
Как обозначать отсутсвие узла? |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
у вас не полное двоичное дерево? это проблема((((( решаемая)))) вариант 0. а полное для вашей задачи не подойдет? вариант 1. теоретически неверный, но практически рабочий. выберите специальное значение, которого в данных быть не может. например, для целых чисел можно взять MAX_INT. вариант 2. отдельно сохраняйте массив с индексами отсутствующих узлов вариант 3. сохраняйте только существующие значения, но для каждого дополнительно указывайте индекс родителя. это имхо проще чем с указателями возиться |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |