Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Запись\Чтение структур данных в файлы


Автор: Compositum 4.4.2013, 19:30
Доброго времени суток.

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

Спасибо

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

Сериализация указателей...хм, не представляю )

Автор: Compositum 4.4.2013, 20:25
Предположим, Вам нужно в двоичном файле хранить некоторое двоичное дерево и пару списков (односвязный и двусвязный), без всяких СУБД. Как реализуете это своими силами?

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

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

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

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

Автор: dershokus 5.4.2013, 10:35
Цитата

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


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

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

Автор: dershokus 5.4.2013, 16:04
Цитата

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

Как обозначать отсутсвие узла?

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

у вас не полное двоичное дерево? 
это проблема((((( 
решаемая))))
вариант 0. а полное для вашей задачи не подойдет?
вариант 1. теоретически неверный, но практически рабочий. выберите специальное значение, которого в данных быть не может. например, для целых чисел можно взять MAX_INT. 
вариант 2. отдельно сохраняйте массив с индексами отсутствующих узлов
вариант 3. сохраняйте только существующие значения, но для каждого дополнительно указывайте индекс родителя. это имхо проще чем с указателями возиться

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)