Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись\Чтение структур данных в файлы 
:(
    Опции темы
Compositum
  Дата 4.4.2013, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



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

Потихоньку изучаю C, если точнее - стандарт ISO/IEC 9899:1990. Когда я ранее писал код на C#, то особо не задумывался о том, как сохранять в файлах состояния различных объектов (сериализация всё делала за меня), а вот в C... Я понимаю, как сохранить в файл массивы структур, содержащих в себе поля базовых типов (int, char, double и т.п.), и как прочитать их обратно, однако в более сложной ситуации возникает заминка... Как правильно сохранять в файл структуры данных, связанных друг с другом посредством указателей, чтобы затем можно было бы прочитать данные обратно из файла, корректно восстановив все связи? 

Спасибо
PM   Вверх
rrrFer
Дата 4.4.2013, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 0
Всего: 1



Думаю самый простой вариант добица чего Вам надо использовать БД типа SQLite: http://www.sqlite.org/ .

Сериализация указателей...хм, не представляю )
PM MAIL WWW ICQ   Вверх
Compositum
Дата 4.4.2013, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Предположим, Вам нужно в двоичном файле хранить некоторое двоичное дерево и пару списков (односвязный и двусвязный), без всяких СУБД. Как реализуете это своими силами?
PM   Вверх
xvr
Дата 5.4.2013, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Есть некоторое количество библиотек для сериализации, правда они в основном для С++. В частности есть соотвествующий пакет в boost'е

В любом случае сериализация (как в С++ так и в чистом С) потребует яных действий со стороны программиста, автомат увы не получится  smile 

PM MAIL   Вверх
fish9370
Дата 5.4.2013, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



не думаю, что хорошая мысль хранить данные в том же формате, в котором они хранятся в памяти, скорости от этого не выиграть, а проблемы получить можно..

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

Это сообщение отредактировал(а) fish9370 - 5.4.2013, 10:20


--------------------
undefined
PM MAIL WWW ICQ   Вверх
dershokus
Дата 5.4.2013, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 7.8.2011

Репутация: нет
Всего: 1



Цитата

нужно в двоичном файле хранить некоторое двоичное дерево


Сохранять в файл список, я считаю, лучше всего немного изменив структуру элемента списка т.е.
    * можно заменять указатели на номера или вообще занулять их (на всякий случай).
    * Записывать данные в правильном порядке т.е. первым идет корень, вторым от него левый узел и третьим - правый. Всегда можно придумать другую модель для конкретного дерева/структуры.
    * Записывать данные по указателям сразу за данными узла дерева (тоесть есть структура узла и данные {к примеру структура ИФО}. Таким образом ну нужно будет востанавливать связи узел-данные.
Не лишним будет ввести какой-то header с версией дампа (хоть к вопросу это и не относится), туда можно поместить некоторые проверочные данные (количество узлов и все такое). 
Все это для того, чтобы восстановить указатели (которые записывать смысла нет).
Вот как-то так smile

Это сообщение отредактировал(а) dershokus - 5.4.2013, 10:37
PM MAIL   Вверх
baldina
Дата 5.4.2013, 12:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Двоичное дерево укладывается в массив безо всяких указателей, поэтому в файле его сохранить очень просто.
Что касается указателей вообще, их значения можно сохранять в файле, а объекты на которые они указывают предварять полем id со значением указателя

PM MAIL   Вверх
dershokus
Дата 5.4.2013, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 7.8.2011

Репутация: нет
Всего: 1



Цитата

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

Как обозначать отсутсвие узла?
PM MAIL   Вверх
baldina
Дата 5.4.2013, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(dershokus @  5.4.2013,  16:04 Найти цитируемый пост)
Как обозначать отсутсвие узла? 

у вас не полное двоичное дерево? 
это проблема((((( 
решаемая))))
вариант 0. а полное для вашей задачи не подойдет?
вариант 1. теоретически неверный, но практически рабочий. выберите специальное значение, которого в данных быть не может. например, для целых чисел можно взять MAX_INT. 
вариант 2. отдельно сохраняйте массив с индексами отсутствующих узлов
вариант 3. сохраняйте только существующие значения, но для каждого дополнительно указывайте индекс родителя. это имхо проще чем с указателями возиться
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0664 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.