powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
25 сообщений из 26, страница 1 из 2
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213581
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

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

Спасибо
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213589
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum(сериализация всё делала за меня)
А сериализацию ты считаешь какой-то уму непостижимой магией? Нет в ней ничего, что нельзя
написать за пару часов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213595
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сообщения по теме приветствуются.
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213598
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumКак правильно сохранять в файл структуры данных, связанных друг с другом
посредством указателей, чтобы затем можно было бы прочитать данные обратно из файла,
корректно восстановив все связи?
Написать функции сериализации и десериализации.

Такое сообщение ты считаешь "по теме"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213645
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предположим, нужно в двоичном файле хранить некоторое двоичное дерево и пару списков (односвязный и двусвязный), без всяких СУБД. Кто как реализовал бы это?
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213647
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что не понятно?
Давай нарисуй структуру, а мы напишем специализацию.
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213648
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА что не понятно?
Непонятно, как записать в файл данные так, чтобы при чтении файла можно было корректно восстановить связи, реализованные в структурах посредством указателей.

Ок, простой пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct myData {
   char *data,
   int someInt,
   double someDouble,
   struct myData *next,
   struct myData *prev
};


MasterZiv Давай нарисуй структуру, а мы напишем специализацию.
Как ты сохранишь в файл двусвязный список из элементов указанной мною структуры и как потом обратно прочтёшь его?
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213666
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

в этом случае список можно сериализовать как обычный линейный массив.
Если связи посложнее, или там какое-то сложное отношение, в качестве
заменителя адреса всегда можно использовать позицию внутри файла.
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213671
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumКак ты сохранишь в файл двусвязный список из элементов указанной мною
структуры и как потом обратно прочтёшь его?
В чём проблема-то?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
void WriteMyData(myData* this)
{
   WriteString(this->data);
   WriteInteger(this->someInt);
   WriteDouble(this->someDouble);
   WriteMyData(this->next);
}

myData* ReadMyData(myData* p)
{
   if (feof(f))
     return NULL;
   myData this = new myData;
   this->data = ReadString();
   this->someInt = ReadInteger();
   this->someDouble = ReadDouble();
   this->prev = p;
   this->next = ReadMyData(this);
   return this;
}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213675
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MozokCompositum,

в этом случае список можно сериализовать как обычный линейный массив.
Если связи посложнее, или там какое-то сложное отношение, в качестве
заменителя адреса всегда можно использовать позицию внутри файла.
Согласен, список можно сохранить массивом... Пусть вместо списка будет двоичное дерево. Я попробую воспользоваться индексом, а в общепринятой практике как решается подобное, индексами?
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213676
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositumа в общепринятой практике как решается подобное, индексами?

Главное средство - мозг, остальное - так, инструменты.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213682
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@Dimitry Sibiryakov
Спасибо за код, я как-то не подумал, что можно в файл не сохранять информацию из указателей (в этом затык был).
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213686
Фотография vromanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,
Можно еще поменять структуры так, чтобы в них использовались не указатели, а например индексы в масиве или смещения относительно начала структуры.
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213688
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vromanovCompositum,
Можно еще поменять структуры так, чтобы в них использовались не указатели, а например индексы в масиве или смещения относительно начала структуры.
В смысле? Предлагаете при записи в файл преобразовывать двоичное дерево в линейный список?
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213712
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum@Dimitry Sibiryakov
Спасибо за код, я как-то не подумал, что можно в файл не сохранять информацию из указателей (в этом затык был).Делать это конечно можно, но бессмысленно. Указатели на то и придуманы чтобы данные в памяти могли находиться в разных местах памяти.
У тебя затык на самом деле в другом, ты не понимаешь структуры данных.

Список (не важно одно- или дву-связный) это всего-лишь одномерный массив у которого элементы разбросаны по памяти в случайном порядке. Если ты поймешь это, то поймешь и то что при сериализации списка достаточно записывать на диск обычный индексированный массив, выкидывая при этом указатели нафиг. А при десериализации превращать этот индексированный массив обратно в список.
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213723
Фотография vromanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumВ смысле? Предлагаете при записи в файл преобразовывать двоичное дерево в линейный список?
Элементы двоичного дерева размещать в массиве. Вместо ссылок - индекс элемента. Запись будет производится просто одним вызовом. Или можно будет использовать сразу memory mapped file.
Вообще обычное дерево и запись на диск плохо совместимы. Лучше уж хотябы b-tree
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213749
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumПотихоньку изучаю C, если точнее - стандарт ISO/IEC 9899:1990. Когда я ранее писал код на C#, то особо не задумывался о том, как сохранять в файлах состояния различных объектов (сериализация всё делала за меня), а вот в C... Я понимаю, как сохранить в файл массивы структур, содержащих в себе поля базовых типов (int, char, double и т.п.), и как прочитать их обратно, однако в более сложной ситуации возникает заминка... Как правильно сохранять в файл структуры данных, связанных друг с другом посредством указателей, чтобы затем можно было бы прочитать данные обратно из файла, корректно восстановив все связи?
Если у тебя есть дерево то навреняка есть итератор. Можно обойти все
элементы и сохранить их сериализуемую часть т.к. контент на диск абсолютно
в любом формате. Можно даже в xml или txt. Важно чтобы при восстановлении
объекта дерева с диска весь контент лёг обрано в соотвествии в правильным
алгоритмом построения. Тоже самое со списками. Если есть связи похожие
на агрегацию то можно сооттв. сохранять объекты в порядке обхода дочерних
объектов.
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213780
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vromanovCompositumВ смысле? Предлагаете при записи в файл преобразовывать двоичное дерево в линейный список?
Элементы двоичного дерева размещать в массиве. Вместо ссылок - индекс элемента. Запись будет производится просто одним вызовом. Или можно будет использовать сразу memory mapped file. Здесь верно.
vromanovВообще обычное дерево и запись на диск плохо совместимы. Лучше уж хотябы b-treeА здесь - глупости.
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213851
Фотография vromanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot White Owl]vromanovvromanovВообще обычное дерево и запись на диск плохо совместимы. Лучше уж хотябы b-treeА здесь - глупости.
Речь идет о том, если файл перидется иногда обновлять блоками. Именно так стоятся индексы баз данных
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213938
Inkelyad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vromanovРечь идет о том, если файл перидется иногда обновлять блоками. Именно так стоятся индексы баз данных
А этим пусть OS занимается. Делаем mmap на файл и дальше работаем просто с памятью.
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38213968
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InkelyadvromanovРечь идет о том, если файл перидется иногда обновлять блоками. Именно так стоятся индексы баз данных
А этим пусть OS занимается. Делаем mmap на файл и дальше работаем просто с памятью.
b-tree специально оптимизирован, чтобы минимально дергать диск.
Это позволяет эффективно использовать b-tree для деревьев напрямую отображаемых с диска в ОЗУ.
Чего не скажешь про деревья вообще, где соседние узлы в дереве могут располагаться в памяти на значительном удалении друг от друга

Но при сериализации это не имеет значения, т.к. тут практически всегда на диск записывается в другом формате чем в ОЗУ.
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38215879
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

В свое время разбирал PDF-формат. Товарищи из Adobe поступают следующим образом:
в конце файла нвходится список всех объектов с элементами вида Номер-Смещение внутри файла.
Соответственно, при необходимости сослаться на другой объект, указывается его номер.
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38216164
Dimitry SibiryakovCompositumКак ты сохранишь в файл двусвязный список из элементов указанной мною
структуры и как потом обратно прочтёшь его?
В чём проблема-то?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
void WriteMyData(myData* this)
{
   WriteString(this->data);
   WriteInteger(this->someInt);
   WriteDouble(this->someDouble);
   WriteMyData(this->next);
}

myData* ReadMyData(myData* p)
{
   if (feof(f))
     return NULL;
   myData *this = new myData;
   this->data = ReadString();
   this->someInt = ReadInteger();
   this->someDouble = ReadDouble();
   this->prev = p;
   this->next = ReadMyData(this);
   return this;
}



А если элементов будет под десятки миллионов, из-за рекурсии стэк не переполнится?
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38218679
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я понял, человек спрашивает про циклические ссылки
но надо ли изобретать велосипед? Неужели в плюсах нету нормальной либы, которая бы это умела?
...
Рейтинг: 0 / 0
Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
    #38219326
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokнасколько я понял, человек спрашивает про циклические ссылки
но надо ли изобретать велосипед? Неужели в плюсах нету нормальной либы, которая бы это умела?Как ты себе представляешь такую либу?
Вот есть у тебя некий самодельный класс - как эта предполагаемая либа сможет узнать какой из элементов класса надо сохранять на диск, а какой из элементов является ссылкой на другой элемент? Учти еще что эти все элементы могут быть объявлены приватными...
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в C правильно сохранять в файл и читать структуры данных, связанных указателями?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]