запись и чтение объектов

Есть вектор, с наполнением которого происходит работа программы. Есть функции побитовой записи и чтения объектов в *.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 шт):

Автор решения: Harry

Я уже приводил эту аналогию, правда, там указатели писались в составе структур; чтоб вот так, прямо записывать указатели вместо данных - это я еще не видел.

Получается примерно так - жена говорит собраться в отпуск и в машину в багажник сложить, ну, там, матрас надувной, палатку, мангал и шампуры - ну, в общем, барахло. Вы же в багажник кладете бумажки с надписями "Матрас - на антресолях", "Палатка - на балконе" и т.д. Так вот сохраняете в файл...

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

Пока вы все на том же месте и не переехали - "работают если программу не закрывать" - эти бумажки работают. Но стоит вам переехать...

Если - подчеркиваю! - если ItemsPull представляет собой POD (plain old data) - только тогда его можно записывать вот так, побитово, через read/write, типа

ItemsPull ip;
fout.write(static_cast<char*>(&ip), sizeof(ItemsPull));

Но если в нем есть какие-то нетривиальные классы, указатели и т.п. - все, писать-читать только отдельными полями с учетом специфики объекта. Как, например, рассказывалось тут.

→ Ссылка