С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
9 / 9 / 8
Регистрация: 08.11.2014
Сообщений: 215
Записей в блоге: 1

Запись и чтение shared_ptr из файла прямого доступа

17.04.2018, 12:20. Показов 2287. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Понадобилось записывать умные указатели моего класса файл
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void SaveToFile(std::string fileName, std::vector<std::shared_ptr<SomeClass>> obj)
{
    std::ofstream toFile(fileName.c_str(), std::ios_base::trunc);
    if (!toFile)
    {
        std::cerr << "File not found" << std::endl;
        return;
    }
    for (auto o : obj)
    {
        toFile.write((char *) &o, sizeof(o));
    }
    toFile.close();
}
Ну, и считывать тоже
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void LoadFromFile(std::string fileName, std::vector<std::shared_ptr<SomeClass>> &obj)
{
    std::ifstream fromFile(fileName.c_str(), std::ios_base::in);
    if (!fromFile)
    {
        std::cerr << "File not found" << std::endl;
        return;
    }
 
    obj.clear();
    std::shared_ptr<SomeClass> me;
    while (fromFile.read((char *) &me, sizeof(me)))
    {
        obj.push_back(me);
    }
 
    fromFile.close();
}
Запись в файл производится нормально (по крайней мере, мне так кажется)
Чтение файла уже не очень
Сам объект me нормально впитывает записанные данные из файла, а вот в вектор они не записываются
По данным отладчика, в вектор попадают shared_ptr с мусором внутри
Я, в принципе, понимаю почему это происходит, но не пойму как всё же правильно считать данные из файла в этом случае

И ещё вопрос: стоит ли вообще записывать умные указатели в файл, для сохранения информации, таким образом, или есть более оптимальный вариант?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.04.2018, 12:20
Ответы с готовыми решениями:

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

Запись данных в файл прямого доступа
Столкнулся проблемой при записи данных в файл прямого доступа. Мне нужно ввести определенную информацию по каждой стране. Разумеется длина...

Запись объекта класса в файл и чтение из файла (Вызвано необработанное исключение: нарушение доступа для чтения)
Доброго времени суток. Вообщем-то есть некий класс Weapons: class Weapons { public: void AddWeapon(string nam, int ispkab, string...

2
 Аватар для igorrr37
2873 / 2020 / 991
Регистрация: 21.12.2010
Сообщений: 3,740
Записей в блоге: 9
17.04.2018, 12:34
а если записывать в файл не указатель а сам объект
C++
1
toFile.write((char *)o.get(), sizeof(*o));
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
17.04.2018, 12:44
C++
1
2
3
4
    for (auto &o : obj)
    {
        toFile.write((char *) (o.get()), sizeof(SomeClass));
    }
C++
1
2
3
4
5
    SomeClass me_src;
    while (fromFile.read((char *) &me_src, sizeof(SomeClass)))
    {
        obj.push_back(std::make_shared<SomeClass>(me_src));
    }
примерно так...

Добавлено через 6 минут
Цитата Сообщение от avraal Посмотреть сообщение
с мусором внутри
ну правильно, адреса памяти в указателе задаются в момент его создания, сохранять их в файл бессмысленно, т.к. при следующем создании объекты будут динамически создаваться уже по совсем другим адресам.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2018, 12:44
Помогаю со студенческими работами здесь

Реализация прямого метода доступа к записям файла для обработки с использованием хеш-функции
Реализовать программу прямого метода доступа к записям в файле для обработки. Файл представляет собой набор данных с прямой организацией...

Модификаторы доступа на чтение и запись
Я разобрался с public, private и protected. А как можно сделать чтобы переменная была публичной, но только на чтение или только на запись?

Проверка прав доступа (чтение/запись) в директории
Нужно проверить, доступна ли данная директория (к примеру &quot;D:\\readonly_folder\&quot;) для записи/чтения файлов. Подскажите, как можно...

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -&gt; Vehicles -&gt; Firetruck_0 В этой папке лежит файл формата .dat Что нужно сделать? ...

Ввод с клавиатуры и запись в файл, чтение из файла и запись в массив, вывод из массива на экран
1.Ввод с клавиатуры и запись в файл, чтение из файла и запись в массив, вывод из массива на экран 2.Ввод с клавиатуры и запись в массив,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru