Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Derpy
3 / 3 / 0
Регистрация: 25.12.2011
Сообщений: 20
#1

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

03.06.2012, 22:02. Просмотров 734. Ответов 3
Метки нет (Все метки)

Есть класса в котором часть полей не базовых динамических типов например 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);
        }
    }
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2012, 22:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как записывать и считывать не POD типы данных из бинарного файла? (C++):

Как записывать и читать с БИНАРНОГО файла - C++
доброго времени суток. вопрос такой. есть программа, игра на которой есть игрок, враг, ловушки, и клад. игроку надо пройти ко кладу...

Как считывать значение строки на экране и записывать её в переменную? - C++
Здравствуйте. Есть программа прикасаться к которой нельзя. То есть она работает сама по себе. В определённой области данной программы...

Fstream не может и записывать в файл, и считывать из него? - C++
fstream file(&quot;as.txt&quot;); int number = 7; file &lt;&lt; number; int numb; file &gt;&gt; numb; cout &lt;&lt; numb &lt;&lt; endl; file.close(); Такой,...

Сведения о машине можно считывать/записывать в файл - C++
Помогите пожалуйста, программа выполняет два действия. Если 1 - в файл записывается марка машины, вес, номер (а000аа). Если 2 -...

Как сделать сохранение/загрузку данных из бинарного файла через классы? - C++
Есть класс Students. class Students{ public: void save(); void load(); ~Students();

Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си? - C++
Добрый вечер! Был бы очень признателен, если бы Вы помогли бы мне понять нижеследующие вопросы: 1. Можете ли на понятным для...

3
ValeryLaptev
Эксперт С++
1042 / 821 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
03.06.2012, 22:28 #2
Для вектора гарантируется размещение элементов в памяти как у массива.
Поэтому можно попробовать вариант записи одним оператором write всего вектора сразу.

Для string'a же гарантии непрерывного размещения нет, поэтому только поэлементно.
0
Derpy
3 / 3 / 0
Регистрация: 25.12.2011
Сообщений: 20
04.06.2012, 15:30  [ТС] #3
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Для вектора гарантируется размещение элементов в памяти как у массива.
Поэтому можно попробовать вариант записи одним оператором write всего вектора сразу.
Ну запишется он нормально да. Но при чтении новый вектор будет иметь не тот размер и его надо будет отдельно считывать и устанавливать или поэлементно читать.
0
ValeryLaptev
Эксперт С++
1042 / 821 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
04.06.2012, 18:15 #4
Цитата Сообщение от Derpy Посмотреть сообщение
Ну запишется он нормально да. Но при чтении новый вектор будет иметь не тот размер и его надо будет отдельно считывать и устанавливать или поэлементно читать.
Совершенно верно.
Поэтому с каждым новым классом в принципе нужно писать методы сериализации и десериализации.
На диске для контейнеров обычно требуется сохранять не только саму информацию, но и обычно некие дополнительные данные вроде размера (количество элементов), и типа элементов. Тогда и можно пооптимизировать ввод-вывод конкретно для данного класса.
0
04.06.2012, 18:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2012, 18:15
Привет! Вот еще темы с ответами:

Как считывать данные из файла? - C++
как считывать и записывать данные из файла по строкам в переменную?

Как считывать матрицу из файла? - C++
Как можно считать матрицу из файла по столбикам? Понятия не имею как можно это сделать, а надо. Матрица как на прикрепленном...

Считывание данных из бинарного файла - C++
Доброго времени суток. Моя проблема уже была озвучена в теме. Вот листинг функции которая должна считывать данные из бинарного...

Чтение данных из бинарного файла - C++
программа должна считывать данные из бинарного файла, записывать их в переменную абстрактного типа данных, описанного в библиотеке, и...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru