С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
#1

Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? - C++

07.10.2013, 20:23. Просмотров 1724. Ответов 22
Метки нет (Все метки)

Знаю как записывать объекты в файл в бинарном виде, но как быть, когда у них динамические поля?
Какой метод использовать? Можете привести самый простейший пример?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2013, 20:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? (C++):

Из переменной типа std::string записать в файл большое количество данных (2 Mb) - C++
Нужно записать в файл большое количество данных. Предполагается, что в переменной большое количество строк следовательно `>>` не...

Записать в файл list (очередь) объектов, в которых содержатся строки string, и считать с файла обратно в list - C++
Извините подскажите пожалуйста, как записать list(очередь) объектов в которых содержаться string, и считать с файла обратно в list;...

Std:string в бинарный файл и обратно - C++
Извините! Тупонул. Уже сам всё сделал. Не знаю как только тему удалить теперь.

Считать текст из файла в строку типа std::string (файловый ввод/вывод) - C++
Доброго всем здравия, непонимание работы с файлами побуждает меня беспокоить вас. Программа копирует с файла текст, и из-за абзацев текст...

Считать граф из файла (граф задан матрицей) представить его в виде списка и записать список заново в файл - C++
помогите очень срочно надо. считать граф из файла (граф задан матрицей) представить его в виде списка и записать список заново в файл ...

Операция std::cout для Объекта типа std::string - C++
Кто детально объяснит почему не выводит ? Дает вот так "Отсутствует оператор "<<", соответствующий этим операндам" void...

22
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.10.2013, 21:54 #2
Так? Или как то по другому надо?
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
#include <iostream>
#include <fstream>
#include <string>
 
int main()
{
   std::string s = "Hello world!!!";
   std::ofstream ofs("D:\\file_with_string.bin", std::ios_base::binary | std::ios_base::out);
 
   std::string::size_type length = s.size();
   ofs.write((char const*)&length, sizeof(length)).write(s.data(), length);
   ofs.close();
 
   std::ifstream ifs("D:\\file_with_string.bin", std::ios_base::binary | std::ios_base::in);
   std::string str_from_file;
   ifs.read((char*)&length, sizeof(length));
   str_from_file.resize(length);
   ifs.read(&str_from_file[0], length).read((char*)&length, sizeof(length));
 
   std::cout << str_from_file << std::endl;
 
   std::cout << "\nDone." << std::endl;
   return 0;
}
2
Убежденный
Ушел с форума
Эксперт С++
15708 / 7219 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.10.2013, 21:57 #3
Цитата Сообщение от murtukov Посмотреть сообщение
Знаю как записывать объекты в файл в бинарном виде, но как быть, когда у них динамические поля?
Какой метод использовать?
С практической точки зрения, лучше всего не изобретать велосипед, а воспользоваться
готовыми библиотеками сериализации. Например, Boost::serialization.
Эта библиотека умеет сохранять и восстанавливать практически любые типы,
включая определенные пользователем.
1
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 21:59  [ТС] #4
Убежденный, я хочу понять как работает велосипед, а не просто ездить на нем)
0
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.10.2013, 21:59 #5
Цитата Сообщение от Убежденный Посмотреть сообщение
С практической точки зрения, лучше всего не изобретать велосипед, а воспользоваться
готовыми библиотеками сериализации. Например, Boost::serialization
Согласен на все 100%.
0
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 22:02  [ТС] #6
DiffEreD, спасибо, сейча изучу ваш код.

Кстати, почему вы каждый раз прописываете std:: а не впишите using namespace std; ?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.10.2013, 22:02 #7
Цитата Сообщение от murtukov Посмотреть сообщение
я хочу понять как работает велосипед, а не просто ездить на нем)
Тогда надо взять его и разобрать Тем более одно название велосипеда дано.
0
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 22:02  [ТС] #8
DiffEreD, спасибо, сейча изучу ваш код.

Кстати, почему вы каждый раз прописываете std:: а не впишите using namespace std; ?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.10.2013, 22:03 #9
Цитата Сообщение от murtukov Посмотреть сообщение
почему вы каждый раз прописываете std:: а не впишите using namespace std; ?
На этот счет тут туева хуча тем. Ищите, найдете быстро.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.10.2013, 22:13 #10
DiffEreD, не пойму, зачем тут второй read?
C++
1
ifs.read(&str_from_file[0], length).read((char*)&length, sizeof(length));
1
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2013, 22:30 #11
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
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
 
 
int main()
{
    stringstream ss
    (
    "htr'jlline1 sdghdfgh       \n"
    "    rert line2 s14f5s45g   \n"
    "  gf      line3 fdsg       \n"
    );
    char * data;
    string text;
    ss.seekg(0, ios::end);
    size_t size = ss.tellg();
    ss.seekg(0, ios::beg);
    data = new char[size];
    ss.read(data, size);
    data[size] = 0;
    cout<<(text = data)<<endl;
    return 0;
}
stringstream заменить на ifstream http://codepad.org/DcXRTgVX
Output:
htr'jlline1 sdghdfgh
rert line2 s14f5s45g
gf line3 fdsg
1
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 23:24  [ТС] #12
Цитата Сообщение от DiffEreD Посмотреть сообщение
Так? Или как то по другому надо?
Я имел ввиду запись ОБЪЕКТА с полем std::string

Например:

C++
1
2
3
4
5
6
7
8
class MyClass
{
private:
    string name;
    int age;
public:
    /*........*/
}
Как сохранить этот объект в файл?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
07.10.2013, 23:27 #13
delete
0
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
07.10.2013, 23:39 #14
Лично мне в голову приходит только 1 способ - написать препроцессор, обрабатывающий классы и структуры и организовывал сериализацию этих классов и структур.
0
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 23:41  [ТС] #15
iRomul,

могли бы вы написать самый простейший пример?
0
07.10.2013, 23:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2013, 23:41
Привет! Вот еще темы с ответами:

Как инициализировать объект типа std::deque<int>? - C++
Доброе время суток! Я видимо совсем не разбираюсь в шаблонах, так как не понимаю почему не работает:std::deque&lt;int&gt; d = {1, 2, 3, 4, 5}; ...

Как скопировать строку типа std::string в другую строку такого же типа? - C++
Хотел скопировать строку #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int _tmain(int...

Как текст из заданного файла присвоить переменной типа std::string? - C++
Здравствуйте, у меня есть файл с текстом, нужно этот текст присвоить переменной string, как это сделать? самый простой вариант желательно

Как создать и заполнить динамический массив строк типа std::string? - C++
Как создать и заполнить динамический массив строк типа string? Если заполнять массивы через getline(), почему то удаляется первая буква в...


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

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

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