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

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

05.07.2013, 07:35. Показов 4600. Ответов 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
5500 / 4895 / 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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.07.2013, 05:06
Цитата Сообщение от d1skort Посмотреть сообщение
Получается бинарные файлы только для статических переменных? А классы можно сохранять ?
Что значит для статических? Тут разговор как раз о классах (set, string). Всё зависит от того, что представляет собой класс, как он организован, какие поля в нём.
0
 Аватар для igorrr37
2883 / 2030 / 992
Регистрация: 21.12.2010
Сообщений: 3,782
Записей в блоге: 9
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru