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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 20:23     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #1
Знаю как записывать объекты в файл в бинарном виде, но как быть, когда у них динамические поля?
Какой метод использовать? Можете привести самый простейший пример?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2013, 20:23     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно?
Посмотрите здесь:

Считать граф из файла (граф задан матрицей) представить его в виде списка и записать список заново в файл C++
C++ Дан исходный текстовый файл. Записать его строки в выходной файл в перевёрнутом виде
C++ Как привести std::wstring к std::string?
Можно ли в std::string записать Ansi символ (например NUL)? C++
C++ Прочитать файл в бинарном режиме с записью результата в string
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.10.2013, 21:54     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #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;
}
Убежденный
Системный программист
 Аватар для Убежденный
14191 / 6206 / 985
Регистрация: 02.05.2013
Сообщений: 10,339
Завершенные тесты: 1
07.10.2013, 21:57     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #3
Цитата Сообщение от murtukov Посмотреть сообщение
Знаю как записывать объекты в файл в бинарном виде, но как быть, когда у них динамические поля?
Какой метод использовать?
С практической точки зрения, лучше всего не изобретать велосипед, а воспользоваться
готовыми библиотеками сериализации. Например, Boost::serialization.
Эта библиотека умеет сохранять и восстанавливать практически любые типы,
включая определенные пользователем.
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 21:59  [ТС]     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #4
Убежденный, я хочу понять как работает велосипед, а не просто ездить на нем)
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.10.2013, 21:59     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #5
Цитата Сообщение от Убежденный Посмотреть сообщение
С практической точки зрения, лучше всего не изобретать велосипед, а воспользоваться
готовыми библиотеками сериализации. Например, Boost::serialization
Согласен на все 100%.
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 22:02  [ТС]     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #6
DiffEreD, спасибо, сейча изучу ваш код.

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

Кстати, почему вы каждый раз прописываете std:: а не впишите using namespace std; ?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.10.2013, 22:03     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #9
Цитата Сообщение от murtukov Посмотреть сообщение
почему вы каждый раз прописываете std:: а не впишите using namespace std; ?
На этот счет тут туева хуча тем. Ищите, найдете быстро.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.10.2013, 22:13     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #10
DiffEreD, не пойму, зачем тут второй read?
C++
1
ifs.read(&str_from_file[0], length).read((char*)&length, sizeof(length));
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2013, 22:30     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #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
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 23:24  [ТС]     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #12
Цитата Сообщение от DiffEreD Посмотреть сообщение
Так? Или как то по другому надо?
Я имел ввиду запись ОБЪЕКТА с полем std::string

Например:

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

могли бы вы написать самый простейший пример?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.10.2013, 23:43     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #16
Цитата Сообщение от murtukov Посмотреть сообщение
Я имел ввиду запись ОБЪЕКТА с полем std::string
ну так определи функцию/метод , которая поочередно пишет все поля класса, пример записи std::string тебе уже дали
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 23:54  [ТС]     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #17
Jupiter, это и называется сериализацией, я так понимаю?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.10.2013, 23:58     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #18
да.
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
08.10.2013, 00:21  [ТС]     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #19
Jupiter, окей, концепцию понял.

Но вот есть вопросы по коду, который дал уважаемый DiffEreD
Не совсем понимаю как этот код работает.

Например:
string::size_type length = s.size(); Видно, что эта строка нужна для определения размера s, но что за size_type? Что это за тип?

И еще не пойму вот эти строки:
ofs.write((char const*)&length, sizeof(length)).write(s.data(), length);
и
ifs.read(&str_from_file[0], length).read((char*)&length, sizeof(length));

я впервые столкнулся с таким. Что это? Двойной вызов метода read()? Почему ifs.read().read()?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2013, 00:30     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно?
Еще ссылки по теме:

Std:string в бинарный файл и обратно C++
C++ Как записать длину строки типа string в переменную
C++ Считать текст из файла и записать его в другой файл, заменив каждую первую букву слов

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
08.10.2013, 00:30     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно? #20
Цитата Сообщение от murtukov Посмотреть сообщение
Почему ifs.read().read()?
потому что
C++
1
istream& read (char* s, streamsize n);
read возвращает поток.

Вы же пишите
C++
1
std :: cin >> x >> y ;
и не задаетесь вопросом почему так?

Добавлено через 1 минуту
И похоже код
Цитата Сообщение от murtukov Посмотреть сообщение
ifs.read(&str_from_file[0], length)
будет верным только начиная с C++11
Yandex
Объявления
08.10.2013, 00:30     Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно?
Ответ Создать тему
Опции темы

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