| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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'е В любом случае сериализация (как в С++ так и в чистом С) потребует яных действий со стороны программиста, автомат увы не получится |
| Автор: fish9370 5.4.2013, 10:18 |
| не думаю, что хорошая мысль хранить данные в том же формате, в котором они хранятся в памяти, скорости от этого не выиграть, а проблемы получить можно.. если нужно сериализовать список, то достаточно слить элементы списка в файл (двоичный, текстовый - не важно), а затем при восстановлении использовать стандартные средства добавления в список.. |
| Автор: dershokus 5.4.2013, 10:35 | ||
Сохранять в файл список, я считаю, лучше всего немного изменив структуру элемента списка т.е.
* Записывать данные в правильном порядке т.е. первым идет корень, вторым от него левый узел и третьим - правый. Всегда можно придумать другую модель для конкретного дерева/структуры. * Записывать данные по указателям сразу за данными узла дерева (тоесть есть структура узла и данные {к примеру структура ИФО}. Таким образом ну нужно будет востанавливать связи узел-данные. Все это для того, чтобы восстановить указатели (которые записывать смысла нет). Вот как-то так |
| Автор: baldina 5.4.2013, 12:05 |
| Двоичное дерево укладывается в массив безо всяких указателей, поэтому в файле его сохранить очень просто. Что касается указателей вообще, их значения можно сохранять в файле, а объекты на которые они указывают предварять полем id со значением указателя |
| Автор: dershokus 5.4.2013, 16:04 | ||
Как обозначать отсутсвие узла? |
| Автор: baldina 5.4.2013, 17:35 |
у вас не полное двоичное дерево? это проблема((((( решаемая)))) вариант 0. а полное для вашей задачи не подойдет? вариант 1. теоретически неверный, но практически рабочий. выберите специальное значение, которого в данных быть не может. например, для целых чисел можно взять MAX_INT. вариант 2. отдельно сохраняйте массив с индексами отсутствующих узлов вариант 3. сохраняйте только существующие значения, но для каждого дополнительно указывайте индекс родителя. это имхо проще чем с указателями возиться |