#c
#c
Вопрос:
В настоящее время я пытаюсь настроить свой код таким образом, чтобы при выходе он сохранял данные пользователя. При повторном использовании программы данные будут восстановлены с того места, на котором они были прерваны. Это единственный раз, когда данные необходимо будет сохранить.
Я довольно новичок в хранении данных, когда я практиковался в этом, я мог хранить строки, целые числа и типы bool, но у меня возникли проблемы при сохранении значения tm, получая следующую ошибку:
no operator found which takes a right-hand operand of type 'tm' (or there is no acceptable conversion)
Вместе с четырьмя значениями int это данные, которые мне нужно сохранить:
map<string, Date*> m_dates;
map<string, Tracker*> m_tasks;
map<string, vector<tm>> m_taskreports;
map<string, tm> m_datereports;
map<string, Goal*> m_goals;
Дата, отслеживание и цель — это классы. Есть ли простой способ сохранить и извлечь эти данные?
Ответ №1:
Вам следует взглянуть на сериализацию.
В информатике, в контексте хранения данных, сериализация (или serialisation) — это процесс перевода структур данных или состояния объекта в формат, который может быть сохранен (например, в файле или буфере памяти) или передан (например, по каналу сетевого подключения) и реконструирован позже (возможно, в другой компьютерной среде).[1] Когда результирующая последовательность битов перечитывается в соответствии с форматом сериализации, ее можно использовать для создания семантически идентичного клона исходного объекта. Для многих сложных объектов, таких как те, которые широко используют ссылки, этот процесс не является простым. Сериализация объектно-ориентированных объектов не включает ни один из связанных с ними методов, с которыми они были ранее связаны.
Это может быть непросто исправить, поэтому я предлагаю использовать существующее решение. Многие библиотеки можно найти на Github.
Ответ №2:
Вероятно, вы можете избавить себя от множества проблем в дальнейшем, сохранив временные метки в виде числовых значений (возвращаемых time
функцией) вместо tm
структуры. Это также пригодится, если вам понадобится что-то отсортировать во временном порядке.
Если вам действительно нужно получить доступ к day, month, year и так далее, То при необходимости вы можете преобразовать числовое значение обратно в tm
struct (см., Например, http://www.cplusplus.com/reference/ctime/localtime /).
Прежде чем использовать time
функцию, взгляните на http://www.cplusplus.com/reference/ctime/time /.
Что касается общей сериализации, пожалуйста, смотрите ответ Ритти.