С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
20 / 20 / 8
Регистрация: 10.02.2013
Сообщений: 75

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

05.07.2013, 07:35. Показов 4549. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2013, 07:35
Ответы с готовыми решениями:

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

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

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

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

Если нужна нормальная сериализация, используйте библиотеки типа Boost.serialization.
Там такие вещи пишутся в несколько строк. И такие библиотеки умеют корректно
сохранять, а затем реконструировать объекты.
0
20 / 20 / 8
Регистрация: 10.02.2013
Сообщений: 75
06.07.2013, 03:49  [ТС]
Получается бинарные файлы только для статических переменных? А классы можно сохранять ?
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.07.2013, 05:06
Цитата Сообщение от d1skort Посмотреть сообщение
Получается бинарные файлы только для статических переменных? А классы можно сохранять ?
Что значит для статических? Тут разговор как раз о классах (set, string). Всё зависит от того, что представляет собой класс, как он организован, какие поля в нём.
0
 Аватар для igorrr37
2870 / 2017 / 991
Регистрация: 21.12.2010
Сообщений: 3,734
Записей в блоге: 8
06.07.2013, 09:19
вот сохранение и загрузка через 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;
}
Code
1
2
3
4
5
6
str1
str2
str3
 
Process returned 0 (0x0)   execution time : 0.350 s
Press any key to continue.
для самописных классов будет аналогично
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.07.2013, 09:19
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru