Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
1

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

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

Знаю как записывать объекты в файл в бинарном виде, но как быть, когда у них динамические поля?
Какой метод использовать? Можете привести самый простейший пример?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2013, 20:23
Ответы с готовыми решениями:

Как записать объект(или хотя бы его поля ) в файл в бинарном виде и считать оттуда?
В txt файлик коллекцию обьектов записать необходимо, и считать потом оттуда.

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

Как считать файл в бинарном виде?
как считать абсолютно любой файл в бинарном виде (в виде двоичного кода) и записать эти данные,...

Как считать в бинарном виде файл из локальной сети
Дело в том, что ADODB.Stream может загружать файлы только с локальных дисков, причём с...

22
1451 / 788 / 257
Регистрация: 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
Ушел с форума
Эксперт С++
16406 / 7381 / 1184
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
07.10.2013, 21:57 3
Цитата Сообщение от murtukov Посмотреть сообщение
Знаю как записывать объекты в файл в бинарном виде, но как быть, когда у них динамические поля?
Какой метод использовать?
С практической точки зрения, лучше всего не изобретать велосипед, а воспользоваться
готовыми библиотеками сериализации. Например, Boost::serialization.
Эта библиотека умеет сохранять и восстанавливать практически любые типы,
включая определенные пользователем.
1
10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 21:59  [ТС] 4
Убежденный, я хочу понять как работает велосипед, а не просто ездить на нем)
0
1451 / 788 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.10.2013, 21:59 5
Цитата Сообщение от Убежденный Посмотреть сообщение
С практической точки зрения, лучше всего не изобретать велосипед, а воспользоваться
готовыми библиотеками сериализации. Например, Boost::serialization
Согласен на все 100%.
0
10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 22:02  [ТС] 6
DiffEreD, спасибо, сейча изучу ваш код.

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

Кстати, почему вы каждый раз прописываете std:: а не впишите using namespace std; ?
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.10.2013, 22:03 9
Цитата Сообщение от murtukov Посмотреть сообщение
почему вы каждый раз прописываете std:: а не впишите using namespace std; ?
На этот счет тут туева хуча тем. Ищите, найдете быстро.
0
5475 / 4870 / 831
Регистрация: 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
10 / 10 / 5
Регистрация: 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
Грамотный. Безпорно.
16860 / 9755 / 1880
Регистрация: 27.09.2012
Сообщений: 24,164
Записей в блоге: 2
07.10.2013, 23:27 13
delete
0
160 / 101 / 14
Регистрация: 17.10.2012
Сообщений: 488
07.10.2013, 23:39 14
Лично мне в голову приходит только 1 способ - написать препроцессор, обрабатывающий классы и структуры и организовывал сериализацию этих классов и структур.
0
10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 23:41  [ТС] 15
iRomul,

могли бы вы написать самый простейший пример?
0
Каратель
Эксперт С++
6596 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
07.10.2013, 23:43 16
Цитата Сообщение от murtukov Посмотреть сообщение
Я имел ввиду запись ОБЪЕКТА с полем std::string
ну так определи функцию/метод , которая поочередно пишет все поля класса, пример записи std::string тебе уже дали
0
10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 23:54  [ТС] 17
Jupiter, это и называется сериализацией, я так понимаю?
0
Каратель
Эксперт С++
6596 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
07.10.2013, 23:58 18
да.
0
10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
08.10.2013, 00:21  [ТС] 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()?
0
Грамотный. Безпорно.
16860 / 9755 / 1880
Регистрация: 27.09.2012
Сообщений: 24,164
Записей в блоге: 2
08.10.2013, 00:30 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
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2013, 00:30

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

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

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


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

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

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