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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
d1skort
20 / 20 / 0
Регистрация: 10.02.2013
Сообщений: 75
05.07.2013, 07:35     Как сохранить\прочитать контейнер в бинарный файл #1
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, но не работает скорее всего из - за того, что там идет работа с динамической памятью. Получается контейнеры вообще нельзя сохранять в бинарные файлы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 07:35     Как сохранить\прочитать контейнер в бинарный файл
Посмотрите здесь:

C++ Прочитать бинарный файл и сделать вычисление
C++ Как правильно сохранить и потом считать структуру в бинарный файл
Данные записать в файл F1.txt, затем прочитать оттуда, обрабатывались и записывались в бинарный файл F2.bin с проверкой C++
C++ Открыть бинарный файл(.ехе) и сохранить часть байтов в текст
C++ Как сохранить контейнеры STL в файл. И как потом их прочитать из файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AntonChik
1083 / 581 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
05.07.2013, 09:42     Как сохранить\прочитать контейнер в бинарный файл #2
проверь чему у тебя равны sizeof mat и sizeof pat
d1skort
20 / 20 / 0
Регистрация: 10.02.2013
Сообщений: 75
05.07.2013, 09:50  [ТС]     Как сохранить\прочитать контейнер в бинарный файл #3
Оба по 24.
AntonChik
1083 / 581 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
05.07.2013, 09:53     Как сохранить\прочитать контейнер в бинарный файл #4
а сколько элементов при этом вводишь?
в общем придется использовать размер контейнера .size() и последовательно пихать элементы в файл в цикле или через итераторы.
Цитата Сообщение от d1skort Посмотреть сообщение
что там идет работа с динамической памятью.
вот именно, записать цельным куском памяти, как это делают с массивами не получится, т.к. элементы контейнера могут быть разбросаны в памяти как угодно.
d1skort
20 / 20 / 0
Регистрация: 10.02.2013
Сообщений: 75
05.07.2013, 09:56  [ТС]     Как сохранить\прочитать контейнер в бинарный файл #5
Хм, понятно. Спасибо.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2013, 19:58     Как сохранить\прочитать контейнер в бинарный файл #6
Цитата Сообщение от AntonChik Посмотреть сообщение
в общем придется использовать размер контейнера .size() и последовательно пихать элементы в файл в цикле или через итераторы.
А размер элементов? Там же string, которые могут иметь самоё разное количество элементов. Тут бинарный режим чтения\записи в принципе не подходит.
Убежденный
Системный программист
 Аватар для Убежденный
14199 / 6214 / 986
Регистрация: 02.05.2013
Сообщений: 10,356
Завершенные тесты: 1
05.07.2013, 21:48     Как сохранить\прочитать контейнер в бинарный файл #7
Цитата Сообщение от d1skort Посмотреть сообщение
C++
1
fout.write((char *) &mat, sizeof mat);
Компилируется и вроде бы сохраняет в файл, но не хочет читать из него. Может я что - то не так делаю?
Так нельзя. std::set, да и другие контейнеры тоже, может содержать указатели и
прочие динамические данные, их не получится просто так скинуть в файл, а потом в
любое время оттуда загрузить как ни в чем не бывало.

Если нужна нормальная сериализация, используйте библиотеки типа Boost.serialization.
Там такие вещи пишутся в несколько строк. И такие библиотеки умеют корректно
сохранять, а затем реконструировать объекты.
d1skort
20 / 20 / 0
Регистрация: 10.02.2013
Сообщений: 75
06.07.2013, 03:49  [ТС]     Как сохранить\прочитать контейнер в бинарный файл #8
Получается бинарные файлы только для статических переменных? А классы можно сохранять ?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.07.2013, 05:06     Как сохранить\прочитать контейнер в бинарный файл #9
Цитата Сообщение от d1skort Посмотреть сообщение
Получается бинарные файлы только для статических переменных? А классы можно сохранять ?
Что значит для статических? Тут разговор как раз о классах (set, string). Всё зависит от того, что представляет собой класс, как он организован, какие поля в нём.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2013, 09:19     Как сохранить\прочитать контейнер в бинарный файл
Еще ссылки по теме:

Прочитать массив чисел неизвестной длины. Какой контейнер использовать? C++
Прочитать бинарный файл C++
Как зашифровать бинарный файл XOR? C++

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

Или воспользуйтесь поиском по форуму:
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 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.
для самописных классов будет аналогично
Yandex
Объявления
06.07.2013, 09:19     Как сохранить\прочитать контейнер в бинарный файл
Ответ Создать тему
Опции темы

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