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

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

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

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

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

Знаю как записывать объекты в файл в бинарном виде, но как быть, когда у них динамические поля?
Какой метод использовать? Можете привести самый простейший пример?
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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.10.2013, 23:43 #16
Цитата Сообщение от murtukov Посмотреть сообщение
Я имел ввиду запись ОБЪЕКТА с полем std::string
ну так определи функцию/метод , которая поочередно пишет все поля класса, пример записи std::string тебе уже дали
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
07.10.2013, 23:54  [ТС] #17
Jupiter, это и называется сериализацией, я так понимаю?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.10.2013, 23:58 #18
да.
murtukov
8 / 8 / 3
Регистрация: 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()?
Croessmah
Модератор
Эксперт CЭксперт С++
13135 / 7398 / 828
Регистрация: 27.09.2012
Сообщений: 18,234
Записей в блоге: 3
Завершенные тесты: 1
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
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.10.2013, 00:30 #21
Цитата Сообщение от murtukov Посмотреть сообщение
Например:
string::size_type length = s.size(); Видно, что эта строка нужна для определения размера s, но что за size_type? Что это за тип?
string::size_type это псведоним типа котрый используется для хранения размера строки, обычно это псевдоним типа size_t, который в свою очередь является псевдонимом беззнакового целого равного машинному слову
murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
08.10.2013, 00:41  [ТС] #22
Croessmah,
в конструкции ifs.read().read()? какой read() выполняется первым? Я так понимаю левый?
Croessmah
Модератор
Эксперт CЭксперт С++
13135 / 7398 / 828
Регистрация: 27.09.2012
Сообщений: 18,234
Записей в блоге: 3
Завершенные тесты: 1
08.10.2013, 00:54 #23
Цитата Сообщение от murtukov Посмотреть сообщение
в конструкции ifs.read().read()? какой read() выполняется первым? Я так понимаю левый?
Да. Такие вещи всегда можно проверить самому.

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
struct Test {
    Test & read ( const char * str ) {
        std :: cout << str << std ::endl ;
        return *this ;
    }
};
 
int main ( ) {
    Test obj ;
    obj.read ( "first" ).read ( "second" ) ;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2013, 00:54
Привет! Вот еще темы с ответами:

Как инициализировать объект типа 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(), почему то удаляется первая буква в...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.10.2013, 00:54
Ответ Создать тему
Опции темы

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