Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
d1skort
20 / 20 / 8
Регистрация: 10.02.2013
Сообщений: 75
#1

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

05.07.2013, 07:35. Просмотров 1596. Ответов 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
Ответы с готовыми решениями:

Как правильно сохранить и потом считать структуру в бинарный файл
Есть структура struct card { int size; char *lear; int *name; }; Эта...

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

Как сохранить контейнеры STL в файл. И как потом их прочитать из файла
В Qt такой контейнер как map&lt;T,T&gt; библиотеки STL заносится в файл занесением в...

Прочитать бинарный файл
Привет. Как прочитать бинарный файл? То есть вывести его байты. Делал так: ...

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

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

Если нужна нормальная сериализация, используйте библиотеки типа Boost.serialization.
Там такие вещи пишутся в несколько строк. И такие библиотеки умеют корректно
сохранять, а затем реконструировать объекты.
0
d1skort
20 / 20 / 8
Регистрация: 10.02.2013
Сообщений: 75
06.07.2013, 03:49  [ТС] #8
Получается бинарные файлы только для статических переменных? А классы можно сохранять ?
0
alsav22
5441 / 4836 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.07.2013, 05:06 #9
Цитата Сообщение от d1skort Посмотреть сообщение
Получается бинарные файлы только для статических переменных? А классы можно сохранять ?
Что значит для статических? Тут разговор как раз о классах (set, string). Всё зависит от того, что представляет собой класс, как он организован, какие поля в нём.
0
igorrr37
1867 / 1483 / 751
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
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
06.07.2013, 09:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2013, 09:19

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

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

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


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

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

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