Форум программистов, компьютерный форум CyberForum.ru

Как записывать и считывать не POD типы данных из бинарного файла? - C++

Восстановить пароль Регистрация
 
Derpy
 Аватар для Derpy
3 / 3 / 0
Регистрация: 25.12.2011
Сообщений: 20
03.06.2012, 22:02     Как записывать и считывать не POD типы данных из бинарного файла? #1
Есть класса в котором часть полей не базовых динамических типов например vector list и подобные.
Как записать экземпляр класса в бинарный файл чтобы потом его нормально считать?
Через boost serialization? Или есть другие варианты?
Если делать через fwrite\fread считываются только поля базового типа.

Добавлено через 10 часов 24 минуты
Пример проблеммы
C++
1
2
3
4
5
6
7
8
9
10
class A
{
 int val;
}
 
class B
{
 string name;
 vector<A> v;
}
В данном случае нужно записать класс B

Добавлено через 11 часов 8 минут
Такой вариант для записи вектора работает но можно ли сделать как нибудь проще?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class A
{
    int val;
public:
    void write(ostream& f) const
    {
        f.write((char*)&val, sizeof(int));
    }
};
 
class B
{
    string name;
    vector<A> v;
public:
    void write()
    {
        ofstream f("dump.bin", ios_base::binary);
        size_t name_size = name.size();
        f.write((char*)&name_size, sizeof(size_t));
        for (int i = 0; i != name.size(); ++i)
        {
            f.write((char*)&name[i], sizeof(char));
        }
        size_t vec_size = v.size();
        f.write((char*)&vec_size, sizeof(size_t));
        for (int i = 0; i != v.size(); ++i)
        {
            v[i].write(f);
        }
    }
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2012, 22:02     Как записывать и считывать не POD типы данных из бинарного файла?
Посмотрите здесь:

Трабл с считыванием данных из бинарного файла C++
Считывание данных из бинарного файла C++
C++ Чтение данных из бинарного файла
Как считывать данные из файла? C++
C++ Как считывать информация с файла по байтам
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
03.06.2012, 22:28     Как записывать и считывать не POD типы данных из бинарного файла? #2
Для вектора гарантируется размещение элементов в памяти как у массива.
Поэтому можно попробовать вариант записи одним оператором write всего вектора сразу.

Для string'a же гарантии непрерывного размещения нет, поэтому только поэлементно.
Derpy
 Аватар для Derpy
3 / 3 / 0
Регистрация: 25.12.2011
Сообщений: 20
04.06.2012, 15:30  [ТС]     Как записывать и считывать не POD типы данных из бинарного файла? #3
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Для вектора гарантируется размещение элементов в памяти как у массива.
Поэтому можно попробовать вариант записи одним оператором write всего вектора сразу.
Ну запишется он нормально да. Но при чтении новый вектор будет иметь не тот размер и его надо будет отдельно считывать и устанавливать или поэлементно читать.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
04.06.2012, 18:15     Как записывать и считывать не POD типы данных из бинарного файла? #4
Цитата Сообщение от Derpy Посмотреть сообщение
Ну запишется он нормально да. Но при чтении новый вектор будет иметь не тот размер и его надо будет отдельно считывать и устанавливать или поэлементно читать.
Совершенно верно.
Поэтому с каждым новым классом в принципе нужно писать методы сериализации и десериализации.
На диске для контейнеров обычно требуется сохранять не только саму информацию, но и обычно некие дополнительные данные вроде размера (количество элементов), и типа элементов. Тогда и можно пооптимизировать ввод-вывод конкретно для данного класса.
Yandex
Объявления
04.06.2012, 18:15     Как записывать и считывать не POD типы данных из бинарного файла?
Ответ Создать тему
Опции темы

Текущее время: 11:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru