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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
d1skort
20 / 20 / 0
Регистрация: 10.02.2013
Сообщений: 75
#1

Как сохранить\прочитать контейнер в бинарный файл - C++

05.07.2013, 07:35. Просмотров 1221. Ответов 9
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    ostream_iterator<string, char> out(cout, "\n");
    set<string> mat;
    set<string> pat;
    string temp;
    cout << "Input Mat's friends:\n";
    while (getline(cin, temp) && temp != "quit")
        mat.insert(temp);
 
    ofstream fout("mat.dat", ios_base::out | ios_base::app | ios_base::binary);
    fout.write((char *) &mat, sizeof mat);
 
    ifstream fin("mat.dat", ios_base::in | ios_base::binary);
    fin.read((char *) &pat, sizeof pat);
 
    cout << "Pat's:\n";
    copy(pat.begin(), pat.end(), out);
Компилируется и вроде бы сохраняет в файл, но не хочет читать из него. Может я что - то не так делаю? Искал в интернете, но везде в основном пишут как сохранять статические переменные, можно ли контейнеры сохранять вообще?

Добавлено через 18 минут
Я не знаю как реализован set, но не работает скорее всего из - за того, что там идет работа с динамической памятью. Получается контейнеры вообще нельзя сохранять в бинарные файлы?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 07:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сохранить\прочитать контейнер в бинарный файл (C++):

Как правильно сохранить и потом считать структуру в бинарный файл - C++
Есть структура struct card { int size; char *lear; int *name; }; Эта структура это карты игрока. Заполняем ее данными, у...

Как сохранить в бинарный файл ресурсы, указатели на которые лежат в векторе? - C++
Здравствуйте! Вот есть такая програмка: #include &lt;iostream&gt; #include &lt;vector&gt; #define FIELD_LENGHT 20 using namespace std; ...

Как сохранить контейнеры STL в файл. И как потом их прочитать из файла - C++
В Qt такой контейнер как map&lt;T,T&gt; библиотеки STL заносится в файл занесением в поток &quot;&lt;&lt;map;&quot; , а как это можно сделать в C++ BUILDER6.0...

Прочитать бинарный файл - C++
Привет. Как прочитать бинарный файл? То есть вывести его байты. Делал так: ifstream ifs(&quot;m.mp3&quot;); int i; while ((i = ifs.get())...

Данные записать в файл F1.txt, затем прочитать оттуда, обрабатывались и записывались в бинарный файл F2.bin с проверкой - C++
Никак не получается отладить в BC++ 3.1. Как сделать в классах так, чтобы введённые данные записывались в файл F1.txt, затем читались...

Прочитать бинарный файл и сделать вычисление - C++
Всем привет! Передо мной стоит следующая задача: 1) Есть бинарный файл (вроде бы) 2) Есть структура написанная в отдельном файле 3)...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
05.07.2013, 09:42 #2
проверь чему у тебя равны sizeof mat и sizeof pat
0
d1skort
20 / 20 / 0
Регистрация: 10.02.2013
Сообщений: 75
05.07.2013, 09:50  [ТС] #3
Оба по 24.
0
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
05.07.2013, 09:53 #4
а сколько элементов при этом вводишь?
в общем придется использовать размер контейнера .size() и последовательно пихать элементы в файл в цикле или через итераторы.
Цитата Сообщение от d1skort Посмотреть сообщение
что там идет работа с динамической памятью.
вот именно, записать цельным куском памяти, как это делают с массивами не получится, т.к. элементы контейнера могут быть разбросаны в памяти как угодно.
1
d1skort
20 / 20 / 0
Регистрация: 10.02.2013
Сообщений: 75
05.07.2013, 09:56  [ТС] #5
Хм, понятно. Спасибо.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 19:58 #6
Цитата Сообщение от AntonChik Посмотреть сообщение
в общем придется использовать размер контейнера .size() и последовательно пихать элементы в файл в цикле или через итераторы.
А размер элементов? Там же string, которые могут иметь самоё разное количество элементов. Тут бинарный режим чтения\записи в принципе не подходит.
0
Убежденный
Системный программист
Эксперт С++
15547 / 7055 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
05.07.2013, 21:48 #7
Цитата Сообщение от d1skort Посмотреть сообщение
C++
1
fout.write((char *) &mat, sizeof mat);
Компилируется и вроде бы сохраняет в файл, но не хочет читать из него. Может я что - то не так делаю?
Так нельзя. std::set, да и другие контейнеры тоже, может содержать указатели и
прочие динамические данные, их не получится просто так скинуть в файл, а потом в
любое время оттуда загрузить как ни в чем не бывало.

Если нужна нормальная сериализация, используйте библиотеки типа Boost.serialization.
Там такие вещи пишутся в несколько строк. И такие библиотеки умеют корректно
сохранять, а затем реконструировать объекты.
0
d1skort
20 / 20 / 0
Регистрация: 10.02.2013
Сообщений: 75
06.07.2013, 03:49  [ТС] #8
Получается бинарные файлы только для статических переменных? А классы можно сохранять ?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.07.2013, 05:06 #9
Цитата Сообщение от d1skort Посмотреть сообщение
Получается бинарные файлы только для статических переменных? А классы можно сохранять ?
Что значит для статических? Тут разговор как раз о классах (set, string). Всё зависит от того, что представляет собой класс, как он организован, какие поля в нём.
0
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
06.07.2013, 09:19 #10
вот сохранение и загрузка через boost
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
#include <iostream>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/set.hpp>
#include <boost/serialization/string.hpp>
 
int main()
{
    std::fstream fs("out.txt", std::ios::out | std::ios::binary);
    if(fs.is_open())
    {
        std::set<std::string> sset1{"str3", "str1", "str2"}, sset2;
        boost::archive::binary_oarchive boa(fs);
        boa << sset1;
        fs.close();
        fs.open("out.txt", std::ios::in | std::ios::binary);
        if(fs.is_open())
        {
            boost::archive::binary_iarchive bia(fs);
            bia >> sset2;
            for(auto const& val : sset2)
                std::cout << val << '\n';
            fs.close();
        }
    }
    return 0;
}
Код
str1
str2
str3

Process returned 0 (0x0)   execution time : 0.350 s
Press any key to continue.
для самописных классов будет аналогично
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2013, 09:19
Привет! Вот еще темы с ответами:

Записать информационную часть списка в бинарный файл, и прочитать его - C++
Подскажите, как записать информационную часть измененного списка в бинарный файл и прочитать его? #include &quot;stdafx.h&quot; #include...

Прочитать файл, заполнить контейнер структур и вывести построчно все записи, упорядоченные по возрастанию - C++
Помогите пожалуйста, только начала работать с файлами и не понимаю даже с чего начать. Текстовый файл содержит записи вида: Фамилия Имя...

Открыть бинарный файл(.ехе) и сохранить часть байтов в текст - C++
Всем привет. Задача такая: нужно прочитать .exe. в конце его есть некие спецсимволы, которые мне нужно прочитать. Например они...

Записать в бинарный файл массив объектов Student (бинарный файловый ввод/вывод) - C++
Здравствуйте. Стоит задача записать в бинарный файл массив объектов student: class student { string firstname,lastname, group; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.07.2013, 09:19
Ответ Создать тему
Опции темы

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