запись и чтение объектов
Есть вектор, с наполнением которого происходит работа программы. Есть функции побитовой записи и чтения объектов в *.dat файл. Они работают если программу не закрывать, но если записать (сохранить) объекты в файл, выйти из программы, заново в неё войти и попытаться загрузить данные в вектор (в него добавляются пустые элементы), то прочитать ничего не выйдет (по идее адреса в потоке летят куда подальше и всё сбивается).
Вопрос: могу ли я что-то подправить в своей реализации дабы объекты сохранялись и я мог их читать (восстанавливать в вектор) даже после перезахода в программу
Функция записи
void dataSave(std::vector <ItemsPull*> itemsActiveVector)
{
std::ofstream fout;
fout.open("SchemeData.dat", std::ios::binary);
for (int i = 0; i < (int)itemsActiveVector.size(); i++)
{
fout.write(reinterpret_cast<char*>(&itemsActiveVector.at(i)), sizeof(ItemsPull*));
}
fout.close();
}
Функция чтения
void dataLoad(std::vector <ItemsPull*> & itemsActiveVector)
{
itemsActiveVector.clear();
std::ifstream fin;
fin.open("SchemeData.dat", std::ios::binary);
ItemsPull* item = new ItemsPull();
while (fin.read(reinterpret_cast<char*>(&item), sizeof(ItemsPull*)))
{
itemsActiveVector.push_back(item);
}
fin.close();
}
Ответы (1 шт):
Я уже приводил эту аналогию, правда, там указатели писались в составе структур; чтоб вот так, прямо записывать указатели вместо данных - это я еще не видел.
Получается примерно так - жена говорит собраться в отпуск и в машину в багажник сложить, ну, там, матрас надувной, палатку, мангал и шампуры - ну, в общем, барахло. Вы же в багажник кладете бумажки с надписями "Матрас - на антресолях", "Палатка - на балконе" и т.д. Так вот сохраняете в файл...
По приезду на место читаете - вынимаете из бумажника бумажки с надписями, где что лежит. Но хуже того, что шкаф теперь совсем другой, балкон тоже, так что втык от жены - это примерно и есть результат вот такого хранения и попытку раскрыть палатку, которой нет...
Пока вы все на том же месте и не переехали - "работают если программу не закрывать" - эти бумажки работают. Но стоит вам переехать...
Если - подчеркиваю! - если ItemsPull представляет собой POD (plain old data) - только тогда его можно записывать вот так, побитово, через read/write, типа
ItemsPull ip;
fout.write(static_cast<char*>(&ip), sizeof(ItemsPull));
Но если в нем есть какие-то нетривиальные классы, указатели и т.п. - все, писать-читать только отдельными полями с учетом специфики объекта. Как, например, рассказывалось тут.