<vector> C++
От: Usefur  
Дата: 29.05.11 19:12
Оценка:
Уважаемые, прошу вашей помощи. Меня интересует вопрос как записать данные из вектора (в моем случае "vector <Person> pers") данные в файл, чтобы потом их можно было считать. В векторе хранятся только данные о Имени, Фамилии, Дате рождения, Телефоне. Ну и нужно их сохранять, чтобы при каждом запуске программы не вводить всю информацию заново. Прочитал что лучше всего сохранять в бинарный файл, но как реализовать не знаю.Напишите пожалуйста код...
с++ vector file
Re: <vector> C++
От: okman Беларусь https://searchinform.ru/
Дата: 29.05.11 19:21
Оценка: +1 -1 :))) :))
Здравствуйте, Usefur, Вы писали:

U>Уважаемые, прошу вашей помощи. Меня интересует вопрос как записать данные из вектора (в моем случае "vector <Person> pers") данные в файл, чтобы потом их можно было считать. В векторе хранятся только данные о Имени, Фамилии, Дате рождения, Телефоне. Ну и нужно их сохранять, чтобы при каждом запуске программы не вводить всю информацию заново. Прочитал что лучше всего сохранять в бинарный файл, но как реализовать не знаю.Напишите пожалуйста код...


Используйте библиотеку сериализации из Boost, она так и называется — serialization.
Пользоваться очень просто, достаточно определить метод serialize для нужного класса и
использовать перегруженный метод &. Кстати, сериализация для контейнеров типа vector в
Boost уже имеется.
Re[2]: <vector> C++
От: Usefur  
Дата: 29.05.11 19:45
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Usefur, Вы писали:


O>Используйте библиотеку сериализации из Boost, она так и называется — serialization.

O>Пользоваться очень просто, достаточно определить метод serialize для нужного класса и
O>использовать перегруженный метод &. Кстати, сериализация для контейнеров типа vector в
O>Boost уже имеется.

Наведите пожалуйста пример
Re[3]: <vector> C++
От: Roman Odaisky Украина  
Дата: 29.05.11 20:12
Оценка: 2 (2) :)))
Здравствуйте, Usefur, Вы писали:

U>Наведите пожалуйста пример


http://lmgtfy.com/?q=boost+serialization+example
До последнего не верил в пирамиду Лебедева.
Re[3]: <vector> C++
От: okman Беларусь https://searchinform.ru/
Дата: 29.05.11 20:51
Оценка: +1
Здравствуйте, Usefur, Вы писали:

U>Здравствуйте, okman, Вы писали:


O>>Здравствуйте, Usefur, Вы писали:


O>>Используйте библиотеку сериализации из Boost, она так и называется — serialization.

O>>Пользоваться очень просто, достаточно определить метод serialize для нужного класса и
O>>использовать перегруженный метод &. Кстати, сериализация для контейнеров типа vector в
O>>Boost уже имеется.

U>Наведите пожалуйста пример


Наводку дали, ссылку тоже. Остальное — медвежья услуга.
Re: <vector> C++
От: Fedor Sumkin
Дата: 29.05.11 22:21
Оценка: -6 :))) :)
Для записи можно использовать write т.к. vector представим в памяти в виде сплошного блока.

Для записи, если не хочется по размеру файла определять размер вектора надо дополнительно записывать размер вектора :
ofstream out ("data.txt", ios::binary);

out.write((char*)&pers.size(), 4);
out.write((char*)&pers[0], pers.size()*sizeof(Person));
out.close();


Для чтения :
int size = 0;

ifstream in("data.txt", ios::binary);
in.read((char*)&size, 4);
pers_in.resize(size);

in.read((char*)&pers_in[0], size*sizeof(Person));
avalon 1.0rc3 rev 419, zlib 1.2.5
Re[2]: <vector> C++
От: peterbes Россия  
Дата: 30.05.11 11:13
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Usefur, Вы писали:


U>>Уважаемые, прошу вашей помощи. Меня интересует вопрос как записать данные из вектора (в моем случае "vector <Person> pers") данные в файл, чтобы потом их можно было считать. В векторе хранятся только данные о Имени, Фамилии, Дате рождения, Телефоне. Ну и нужно их сохранять, чтобы при каждом запуске программы не вводить всю информацию заново. Прочитал что лучше всего сохранять в бинарный файл, но как реализовать не знаю.Напишите пожалуйста код...


O>Используйте библиотеку сериализации из Boost, она так и называется — serialization.

O>Пользоваться очень просто, достаточно определить метод serialize для нужного класса и
O>использовать перегруженный метод &. Кстати, сериализация для контейнеров типа vector в
O>Boost уже имеется.

Зачем для таких задач нужен буст, если решения подобных задач занимает 30-60 строк?
Re[2]: <vector> C++
От: peterbes Россия  
Дата: 30.05.11 11:18
Оценка: -1
Здравствуйте, Fedor Sumkin, Вы писали:

FS>Для записи можно использовать write т.к. vector представим в памяти в виде сплошного блока.


FS>Для записи, если не хочется по размеру файла определять размер вектора надо дополнительно записывать размер вектора :

FS>
FS>ofstream out ("data.txt", ios::binary);

FS>out.write((char*)&pers.size(), 4);
FS>out.write((char*)&pers[0], pers.size()*sizeof(Person));
FS>out.close();
FS>


FS>Для чтения :

FS>
FS>int size = 0;

FS>ifstream in("data.txt", ios::binary);
FS>in.read((char*)&size, 4);
FS>pers_in.resize(size);

FS>in.read((char*)&pers_in[0], size*sizeof(Person));
FS>



На выходе ты гарантировано получишь труху, хорошо если такое рухнет сразу, до того как в программе появится мусор, который начнут писать в базу данных.
Re[2]: <vector> C++
От: Анатолий Широков СССР  
Дата: 30.05.11 11:32
Оценка: 2 (1) +2
Здравствуйте, Fedor Sumkin, Вы писали:

FS>Для записи можно использовать write т.к. vector представим в памяти в виде сплошного блока.


FS>Для записи, если не хочется по размеру файла определять размер вектора надо дополнительно записывать размер вектора :


Подобное допустимо только для сохранения коллекции POD типов.
Re[3]: <vector> C++
От: okman Беларусь https://searchinform.ru/
Дата: 30.05.11 11:49
Оценка:
Здравствуйте, peterbes, Вы писали:

P>Зачем для таких задач [сериализация] нужен буст, если решения подобных задач занимает 30-60 строк?


Не скажите.
Сериализация контейнеров пользовательских типов, да еще с деконструированием-реконструированием
ссылок и указателей на другие объекты, будет занимать отнюдь не 30-60 строк, а на пару порядков больше.
Да и вообще, по большому счету я не вижу причин не использовать Boost, особенно в таких
традиционных задачах. Весь Boost для этого тянуть не надо, к слову говоря.
Re[4]: <vector> C++
От: peterbes Россия  
Дата: 30.05.11 12:18
Оценка: +3
Здравствуйте, okman, Вы писали:

O>Здравствуйте, peterbes, Вы писали:


P>>Зачем для таких задач [сериализация] нужен буст, если решения подобных задач занимает 30-60 строк?


O>Не скажите.

O>Сериализация контейнеров пользовательских типов, да еще с деконструированием-реконструированием
O>ссылок и указателей на другие объекты, будет занимать отнюдь не 30-60 строк, а на пару порядков больше.
O>Да и вообще, по большому счету я не вижу причин не использовать Boost, особенно в таких
O>традиционных задачах. Весь Boost для этого тянуть не надо, к слову говоря.


У бустовских сериализаторов масса своих недостатков, нужно хотя бы читать в той же последовательности в какой данные были записаны, для бинарных сериализаторов такой такой порядок может быть и приемлем, но когда данные пишутся в обычный XML, такие ограничения смотрятся совсем дико. Может статься так, что данные будут генерироваться другими разработчиками, для начала можно будет объяснить, что порядок записи менять нельзя, в будущем это будет источник ошибок.
Для данной задачи вообще не нужно городить огород, если нет никаких требований к формату, то для начала можно всё писать в обычный CVS. А прочитать все строки до перевода строки из файла, распарсить данные по разделителям, конвертировать строки в данные, создать объект Person, инициализировать поля прочитанными данными и включить объект в вектор это задача нескольких десятков строк, буст здесь реально не нужен и вреден.
Re[5]: <vector> C++
От: okman Беларусь https://searchinform.ru/
Дата: 30.05.11 13:34
Оценка:
Здравствуйте, peterbes.

Вы в чем-то и правы, а в чем-то — нет.
Помимо технических деталей, которые сразу приходят в голову при попытке написания своего
сериализатора, — а это проблемы хранения std::string и std::wstring в одном архиве,
необходимость escape-последовательностей для текстового формата и другие, — есть еще внешние
факторы, которые оказывают влияние на выбор решения, и факторы весомые.

Во-первых, любой серъезный код — subject to change (предмет изменений), как мне нравится говорить.
Часто программист не в состоянии предвидеть, что случится с его классом Person, изначально
хранившим имя и возраст, а потом разросшимся до пятнадцати полей и восемнадцати методов.
И тогда у него, возможно, не останется выбора, кроме как использовать Boost.serialization, а
ведь это можно было сделать сразу, ничего не теряя. Замечу, что такая модернизация
может быть связана со значительными изменениями в клиентском коде.

Во-вторых, время и ресурсы тоже ограничены. На освоение упомянутой библиотеки уйдет часик-другой, а
приобретенные знания можно будет быстро применить в другой ситуации. Согласитесь, это гораздо
проще и эффективнее, чем снова писать нужную в данном конкретном случае реализацию, пусть даже
немного более прозрачную и безопасную.

Писать велосипед можно только тогда, когда ни одно из существующих решений не удовлетворяет в полной
мере условиям задачи или техническим требованиям, таким как скорость, например.
Вот тогда и имеет смысл засесть и поднапрячь мозги.
Re[2]: <vector> C++
От: _ds_  
Дата: 30.05.11 13:52
Оценка:
Здравствуйте, okman, Вы писали:

O>Используйте библиотеку сериализации из Boost, она так и называется — serialization.

O>Пользоваться очень просто, достаточно определить метод serialize для нужного класса и
O>использовать перегруженный метод &. Кстати, сериализация для контейнеров типа vector в
O>Boost уже имеется.

boost::serialization не лишен недостатков: http://mdf-i.blogspot.com/2011/02/boostserialization-hell.html
Re: <vector> C++
От: urukhai Украина  
Дата: 30.05.11 14:02
Оценка:
Здравствуйте, Usefur, Вы писали:

U>Уважаемые, прошу вашей помощи. Меня интересует вопрос как записать данные из вектора (в моем случае "vector <Person> pers") данные в файл, чтобы потом их можно было считать. В векторе хранятся только данные о Имени, Фамилии, Дате рождения, Телефоне. Ну и нужно их сохранять, чтобы при каждом запуске программы не вводить всю информацию заново. Прочитал что лучше всего сохранять в бинарный файл, но как реализовать не знаю.Напишите пожалуйста код...


сдаётся мне что тут ищется помощь в "написании лабораторной работы", я угадал?

Для начала гугли (или копай МСДН) в поисках стандартных операций для работы с файлами, даю наводку:
1. fopen() — открытие файла, fprintf() — запись в файл, fscanf() — чтение из файла, fclose()-закрытие файла.
2. вариант продвинутее, класс fstream.

ну а потом подумай как тебе удобно упаковать данные в блоки чтоб их потом оттуда можно было однозначно вычитать.
Re[6]: Не используйте Boost.serialization
От: B0FEE664  
Дата: 30.05.11 14:36
Оценка: -1
Здравствуйте, okman, Вы писали:

O>Во-первых, любой серъезный код — subject to change (предмет изменений), как мне нравится говорить.

O>Часто программист не в состоянии предвидеть, что случится с его классом Person, изначально
O>хранившим имя и возраст, а потом разросшимся до пятнадцати полей и восемнадцати методов.
O>И тогда у него, возможно, не останется выбора, кроме как использовать Boost.serialization, а
O>ведь это можно было сделать сразу, ничего не теряя. Замечу, что такая модернизация
O>может быть связана со значительными изменениями в клиентском коде.

И что будет с обратной совместимостью при использовании Boost.serialization, если, скажем, в коде вам потребовалось заменить std::list<Person> на std::vector<Person> ?

O>Во-вторых, время и ресурсы тоже ограничены. На освоение упомянутой библиотеки уйдет часик-другой, а

O>приобретенные знания можно будет быстро применить в другой ситуации. Согласитесь, это гораздо
O>проще и эффективнее, чем снова писать нужную в данном конкретном случае реализацию, пусть даже
O>немного более прозрачную и безопасную.

А потом уйдут многие часы на борьбу с ошибками Boost.serialization.

O>Писать велосипед можно только тогда, когда ни одно из существующих решений не удовлетворяет в полной

O>мере условиям задачи или техническим требованиям, таким как скорость, например.
O>Вот тогда и имеет смысл засесть и поднапрячь мозги.

Велосипеды хороши тем, что свои ошибки ты всегда можешь исправить...
И каждый день — без права на ошибку...
Re[2]: <vector> C++
От: Usefur  
Дата: 30.05.11 14:40
Оценка:
Здравствуйте, urukhai, Вы писали:

U>Здравствуйте, Usefur, Вы писали:


U>>Уважаемые, прошу вашей помощи. Меня интересует вопрос как записать данные из вектора (в моем случае "vector <Person> pers") данные в файл, чтобы потом их можно было считать. В векторе хранятся только данные о Имени, Фамилии, Дате рождения, Телефоне. Ну и нужно их сохранять, чтобы при каждом запуске программы не вводить всю информацию заново. Прочитал что лучше всего сохранять в бинарный файл, но как реализовать не знаю.Напишите пожалуйста код...


U>сдаётся мне что тут ищется помощь в "написании лабораторной работы", я угадал?


U>Для начала гугли (или копай МСДН) в поисках стандартных операций для работы с файлами, даю наводку:

U>1. fopen() — открытие файла, fprintf() — запись в файл, fscanf() — чтение из файла, fclose()-закрытие файла.
U>2. вариант продвинутее, класс fstream.

U>ну а потом подумай как тебе удобно упаковать данные в блоки чтоб их потом оттуда можно было однозначно вычитать.


Е нет...на курсовую(которую мне послезавтра сдавать))
Re[7]: Не используйте Boost.serialization
От: blackhearted Украина  
Дата: 30.05.11 14:44
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, okman, Вы писали:


O>>Во-первых, любой серъезный код — subject to change (предмет изменений), как мне нравится говорить.

O>>Часто программист не в состоянии предвидеть, что случится с его классом Person, изначально
O>>хранившим имя и возраст, а потом разросшимся до пятнадцати полей и восемнадцати методов.
O>>И тогда у него, возможно, не останется выбора, кроме как использовать Boost.serialization, а
O>>ведь это можно было сделать сразу, ничего не теряя. Замечу, что такая модернизация
O>>может быть связана со значительными изменениями в клиентском коде.

BFE>И что будет с обратной совместимостью при использовании Boost.serialization, если, скажем, в коде вам потребовалось заменить std::list<Person> на std::vector<Person> ?

а что будет в собственноручно написанном велосипеде? шоколад?

O>>Во-вторых, время и ресурсы тоже ограничены. На освоение упомянутой библиотеки уйдет часик-другой, а

O>>приобретенные знания можно будет быстро применить в другой ситуации. Согласитесь, это гораздо
O>>проще и эффективнее, чем снова писать нужную в данном конкретном случае реализацию, пусть даже
O>>немного более прозрачную и безопасную.

BFE>А потом уйдут многие часы на борьбу с ошибками Boost.serialization.

можно пример ошибки?

O>>Писать велосипед можно только тогда, когда ни одно из существующих решений не удовлетворяет в полной

O>>мере условиям задачи или техническим требованиям, таким как скорость, например.
O>>Вот тогда и имеет смысл засесть и поднапрячь мозги.

BFE>Велосипеды хороши тем, что свои ошибки ты всегда можешь исправить...


а буст, типа, закрыт?
Re[8]: Не используйте Boost.serialization
От: B0FEE664  
Дата: 30.05.11 15:27
Оценка: 1 (1)
Здравствуйте, blackhearted, Вы писали:
B>Здравствуйте, B0FEE664, Вы писали:

BFE>>И что будет с обратной совместимостью при использовании Boost.serialization, если, скажем, в коде вам потребовалось заменить std::list<Person> на std::vector<Person> ?

B>а что будет в собственноручно написанном велосипеде? шоколад?

Да, если писать сериализацию объектов, а не типов.

O>>>Во-вторых, время и ресурсы тоже ограничены. На освоение упомянутой библиотеки уйдет часик-другой, а

O>>>приобретенные знания можно будет быстро применить в другой ситуации. Согласитесь, это гораздо
O>>>проще и эффективнее, чем снова писать нужную в данном конкретном случае реализацию, пусть даже
O>>>немного более прозрачную и безопасную.

BFE>>А потом уйдут многие часы на борьбу с ошибками Boost.serialization.

B>можно пример ошибки?

здесь
Автор: _ds_
Дата: 30.05.11

У нас те же самые проблемы.

BFE>>Велосипеды хороши тем, что свои ошибки ты всегда можешь исправить...

B>а буст, типа, закрыт?

Вот возьмите буст, найдите тикет на ошибку в Boost.serialization для 1.42. И попробуйте её понять.
Я пробовал. Я знаю, насколько это не просто. Особенно в то время "радовали" комминтарии автора, типа "две недели провожу поиски ошибки — пока не нашёл"

Ладно, допустим я нашел ошибку и исправил. А дальше что ? Авторы, которые пишут в буст посчитают, что такое исправление в новой версии не нужно. Забъют на обратную совместимость под лозунгом: новая версия свободна от старых ошибок. Значит придётся использовать старую версию буста ? А у нас в проекте есть ещё и другие библиотеки, которые косвенно зависят от новой версии буста и со старой не совместимы. Значит при компиляции придётся использовать две разные версии буста ? Или локально патчит каждую новую версию?
Я таким путём решил не ходить. Я написал обходной код и использовал его некоторое время. Потом проект перешёл к другому человеку и он (вернее она) промучившись некоторое время с этим кодом написала по два разных способа сериализации для загрузки старых и новых версий файлов. К счастью для нашего проекта это удалось сделать, но так повезло не всем.

Открытость и закрытость сути не меняет. Зависимость от авторов библиотеки остаётся.
И каждый день — без права на ошибку...
Re[7]: Не используйте Boost.serialization
От: okman Беларусь https://searchinform.ru/
Дата: 30.05.11 16:14
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>И что будет с обратной совместимостью при использовании Boost.serialization, если, скажем, в коде вам потребовалось заменить std::list<Person> на std::vector<Person> ?


Речь шла не об обратной совместимости, а о том, что широта классов и ситуаций, охватываемых
бустовской сериализацией, с лихвой покрывает большинство прикладных задач, чего не скажешь про
самописные решения, которые приходится дорабатывать "на ходу" и нередко перепроектировать
клиентский интерфейс. В приведенном Вами примере, скорее всего, почти ничего переделывать
не придется — для list в бусте уже определены функции сериализации, в Person тоже.
Так что, вероятно, дело может свестить к простой замене одного-двух заголовков.

O>>Во-вторых, время и ресурсы тоже ограничены. На освоение упомянутой библиотеки уйдет часик-другой, а

O>>приобретенные знания можно будет быстро применить в другой ситуации. Согласитесь, это гораздо
O>>проще и эффективнее, чем снова писать нужную в данном конкретном случае реализацию, пусть даже
O>>немного более прозрачную и безопасную.

BFE>А потом уйдут многие часы на борьбу с ошибками Boost.serialization.


Это можно сказать про любую библиотеку. Все же разумнее доверять популярным решениям, которые
массово "обкатываются" и постоянно доводятся до ума.
Re[2]: <vector> C++
От: Fedor Sumkin
Дата: 30.05.11 19:51
Оценка:
Да, данный способ верен для POD-типов и хорош тем что не надо задумываться о внутреннем устройстве структуры/класса — единственное, что нужно использовать — массивы вместо указателей. Также, его можно легко расширить, добавив дополнительные данные в структуру и ничего не поломается(если нет необходимости в поддержке совместимости со старыми форматами файлов где хранится информация). В рамках поставленной задачи — самое разумное решение в 30-50 строк. Ну и что, что файл может стать большим — чем-то приходится жертвовать.

Раз кто-то усомнился в том что так можно(а минусов-то понаставили ) — привожу полный код решения.

Запись :
#include <fstream>
#include <vector>

using namespace std;

struct Person {
    int age;
    char fir_name[30];
    char sec_name[30];
};

Person p = {20, "Martin", "Fowler"};

int main () {
    vector<Person> pers;

    pers.push_back(p);
    pers.push_back(p);

    ofstream out ("data.txt", ios::binary);
    int size = pers.size();
    out.write((char*)(&size), 4);
    out.write((char*)&pers[0], pers.size()*sizeof(Person));
    out.close();
}


Чтение :
#include <fstream>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

struct Person {
    int age;
    char fir_name[30];
    char sec_name[30];
};

Person p;

int main () {
    vector<Person> pers;

    int size = 0;

    ifstream in("data.txt", ios::binary);
    in.read((char*)&size, 4);
    pers.resize(size);

    in.read((char*)&pers[0], size*sizeof(Person));

    for_each(pers.begin(), pers.end(), [](Person p) -> int {
            cout << "age-" << p.age << endl;
            cout << "fir_name-" << p.fir_name << endl;
            cout << "sec_name-" << p.sec_name << endl
        });

    in.close();
    }
avalon 1.0rc3 rev 419, zlib 1.2.5
Re[3]: <vector> C++
От: Usefur  
Дата: 30.05.11 20:40
Оценка:
Здравствуйте, Fedor Sumkin, Вы писали:

FS>Да, данный способ верен для POD-типов и хорош тем что не надо задумываться о внутреннем устройстве структуры/класса — единственное, что нужно использовать — массивы вместо указателей. Также, его можно легко расширить, добавив дополнительные данные в структуру и ничего не поломается(если нет необходимости в поддержке совместимости со старыми форматами файлов где хранится информация). В рамках поставленной задачи — самое разумное решение в 30-50 строк. Ну и что, что файл может стать большим — чем-то приходится жертвовать.


FS>Раз кто-то усомнился в том что так можно(а минусов-то понаставили ) — привожу полный код решения.



    vector <Person> pers;

    pers.push_back(Person);

    ofstream out ("E:\\file1.txt", ios::binary);
    int size = pers.size();
    out.write((char*)(&size), 4);
    out.write((char*)&pers[0], pers.size()*sizeof(Person));
    out.close();}

Вот в pers.push_back(Person); что именно из елементов нужно писать?...Чтобы весь класс сохранить в нем.

class Person{

public:
        Person(){}    
        ~Person(){}   
        
        
        string GetFamiliya(){ return persFamiliya;}
        string GetName(){ return persName;}
        string GetData(){ return persData;}
        string GetTelefon(){ return persTelefon;}

        
        void SetFamiliya(string fam){ persFamiliya=fam;}
        void SetName(string name){ persName=name;}
        void SetData(string data){ persData=data;}
        void SetTelefon(string tel){ persTelefon=tel;}

        
        void Print();
        
private:
        string persFamiliya;
        string persName;
        string persData;
        string persTelefon;
        
};
Re[3]: <vector> C++
От: Usefur  
Дата: 30.05.11 20:54
Оценка:
Здравствуйте, Fedor Sumkin, Вы писали:

FS>Да, данный способ верен для POD-типов и хорош тем что не надо задумываться о внутреннем устройстве структуры/класса — единственное, что нужно использовать — массивы вместо указателей. Также, его можно легко расширить, добавив дополнительные данные в структуру и ничего не поломается(если нет необходимости в поддержке совместимости со старыми форматами файлов где хранится информация). В рамках поставленной задачи — самое разумное решение в 30-50 строк. Ну и что, что файл может стать большим — чем-то приходится жертвовать.


FS>Раз кто-то усомнился в том что так можно(а минусов-то понаставили ) — привожу полный код решения.


У меня есть класс Person вот
class Person{

public:
        Person(){}    
        ~Person(){}   
        
        
        string GetFamiliya(){ return persFamiliya;}
        string GetName(){ return persName;}
        string GetData(){ return persData;}
        string GetTelefon(){ return persTelefon;}

        
        void SetFamiliya(string fam){ persFamiliya=fam;}
        void SetName(string name){ persName=name;}
        void SetData(string data){ persData=data;}
        void SetTelefon(string tel){ persTelefon=tel;}

        
        void Print();
        
private:
        string persFamiliya;
        string persName;
        string persData;
        string persTelefon;
        
};


Данные уже вводятся в вектор тут:
string sbuf;
        Person bufPers;
        cout<<endl;
                cout<<Rus("__________Добавление записи о читателе__________\n");
                cout<<Rus("Фамилия: ");
        cin>>sbuf;
        bufPers.SetFamiliya(sbuf);

        cout<<endl
                <<Rus("Имя: ");
        cin>>sbuf;
        bufPers.SetName(sbuf);

        cout<<endl
                <<Rus("Дата рождения: ");
        cin>>sbuf;
        bufPers.SetData(sbuf);

        cout<<endl
                <<Rus("Телефон:");
        cin>>sbuf;
        bufPers.SetTelefon(sbuf);

        pers.push_back(bufPers);
        cout<<Rus("__________Готово!__________\n");
}


То есть, исходя из вашего кода
vector<Person> pers;

    pers.push_back(p);
    pers.push_back(p);

    ofstream out ("data.txt", ios::binary);
    int size = pers.size();
    out.write((char*)(&size), 4);
    out.write((char*)&pers[0], pers.size()*sizeof(Person));
    out.close();


Как записать весь класс в файл, тут pers.push_back(p); запис. Person p = {20, "Martin", "Fowler"};
А что писать чтобы мой клас сохранился?
Re[4]: <vector> C++
От: Usefur  
Дата: 30.05.11 21:20
Оценка:
Да, решил с записью.
Теперь с считыванием:

 vector<Person> pers;
    Person p;
    int size = 0;

    ifstream in("E:\\file1.txt", ios::binary);
    in.read((char*)&size, 4);
    pers.resize(size);

    in.read((char*)&pers[0], size*sizeof(Person));

    for_each(pers.begin(), pers.end(), [](Person p) -> stream {
            cout << "Familiya-" << pers.Familiya << endl;
            cout << "Name-" << pers.Name << endl;
            cout << "Data-" << pers.Data << endl;
        cout << "Telefon-" << pers.Telefon << endl;
        });

    in.close();


error C2059: syntax error : '['

Вот тут что именно писать чтобы считать в ту же Familiya например.

cout << "Familiya-" << pers.Familiya << endl;
error C2039: 'Familiya' : is not a member of 'std::vector<_Ty>'
Re[3]: <vector> C++
От: peterbes Россия  
Дата: 31.05.11 04:55
Оценка:
Федор с чем конкретным ты несогласен?

Эти строки полнейшая лажа, у тебя имеется другое мнение?
out.write((char*)&pers[0], pers.size()*sizeof(Person)
in.read((char*)&pers_in[0], size*sizeof(Person));

вместо того что бы кидаться минусами, взял бы написал тестовый пример хотя бы с таким классом

struct P
{    
    ~P(){delete[] A;delete[] B;delete[] C;}
    P(){A=new char[0xFF]; B=new char[0xFF];C=new char[0xFF];}
    
    void operator = (const P & p) {memcpy(A,p.A,0xFF);memcpy(B,p.B,0xFF);memcpy(C,p.C,0xFF);}
    void foo();
    char* A;
    char* B;
    char* C;
};

Ну,скопировал ты 12 байт в какой-то массив, любое обращение к полям прочитанного объекта это гарантированное падение твоей программы.
Re[4]: <vector> C++
От: BulatZiganshin  
Дата: 31.05.11 05:28
Оценка:
Здравствуйте, peterbes, Вы писали:

P>вместо того что бы кидаться минусами, взял бы написал тестовый пример хотя бы с таким классом


он говорит о POD записи, ты не знаешь что это такое?
Люди, я люблю вас! Будьте бдительны!!!
Re[5]: <vector> C++
От: peterbes Россия  
Дата: 31.05.11 05:52
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>он говорит о POD записи, ты не знаешь что это такое?


Знаю, первоначальные условия ничего не говорят о PODе, нет даже намека на это, ПОД зачем-то затащили уже потом, следующим шагом будет появление sqlite.
Re: <vector> C++
От: AleksandrN Россия  
Дата: 31.05.11 06:25
Оценка:
Здравствуйте, Usefur, Вы писали:

U>Уважаемые, прошу вашей помощи. Меня интересует вопрос как записать данные из вектора (в моем случае "vector <Person> pers") данные в файл, чтобы потом их можно было считать. В векторе хранятся только данные о Имени, Фамилии, Дате рождения, Телефоне. Ну и нужно их сохранять, чтобы при каждом запуске программы не вводить всю информацию заново.


Думаю, для лабораторки проще сделать текстовый файл
В классе Person создай методы
bool Write(FILE *);
bool Read(FILE *);

Для записи, иди по списку и для каждого Person вызывай Write.
Для чтения, создавай Person, вызывай Read, добавляй Person список. Читай файл до тех пор, пока feof() ноль возвращает.

Используй fopen, fclose, fprintf, fscanf, feof.
Re[8]: Не используйте Boost.serialization
От: Serg27  
Дата: 31.05.11 07:27
Оценка: 8 (2) +1
Здравствуйте, blackhearted, Вы писали:


BFE>>А потом уйдут многие часы на борьбу с ошибками Boost.serialization.

B>можно пример ошибки?
здесь
Обратите внимание на длину обсуждения, длительность, результативность и т.п. Кроме того есть соответствующие обсуждения в блоге разработчиков. Для себя сделали вывод — boost::serialization является фактически не поддерживаемой и прекратили ее использование в проекте (как раз шла модернизация...)

Boost по своей природе не является брендом, который гарантирует хоть какое-то сопровождение. У него просто нет механизмов для поддержки, кроме доброй воли авторов. Поэтому надо всегда смотреть на каждую отдельную библиотеку из boost и принимать решение об ее использовании независимо. boost как бренд гарантирует только определенное качество продукта и качество проектных решений.
Re[9]: Не используйте Boost.serialization
От: okman Беларусь https://searchinform.ru/
Дата: 31.05.11 08:59
Оценка:
Здравствуйте, Serg27, Вы писали:

S>...

S>Для себя сделали вывод — boost::serialization является фактически не поддерживаемой и прекратили ее использование в проекте (как раз шла модернизация...)

Любопытства ради — что использовали взамен ?
Re[9]: Не используйте Boost.serialization
От: los puercos  
Дата: 31.05.11 10:27
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>>>А потом уйдут многие часы на борьбу с ошибками Boost.serialization.

B>>можно пример ошибки?

BFE>здесь
Автор: _ds_
Дата: 30.05.11

BFE>У нас те же самые проблемы.

Отсутствие обратной совместимости — все-таки, ошибка дизайна, с ней бороться бесполезно, можно только отказаться от использования библиотеки.

К тому же, не всем критична обратная совместимость.
Мы при выходе новой версии можем оперативно перетащить все сервера и клиенты, это разовый и нечастый гемор. В остальном же boost.serialization всем устраивает.
Re[3]: <vector> C++
От: los puercos  
Дата: 31.05.11 11:49
Оценка:
Здравствуйте, Usefur, Вы писали:

U>>ну а потом подумай как тебе удобно упаковать данные в блоки чтоб их потом оттуда можно было однозначно вычитать.


U>Е нет...на курсовую(которую мне послезавтра сдавать))


Товарищу майору сдадите.
(когда будут отпускать в увольнение, подучи все же С++, пригодится )
Re[10]: Не используйте Boost.serialization
От: Serg27  
Дата: 31.05.11 16:43
Оценка: 1 (1) :)
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Serg27, Вы писали:


S>>...

S>>Для себя сделали вывод — boost::serialization является фактически не поддерживаемой и прекратили ее использование в проекте (как раз шла модернизация...)

O>Любопытства ради — что использовали взамен ?

Так как фактически сериализовались объекты, которые описывали конфигурацию, то был произведен переход на json. Массовое использование boost::serialization для собственно данных было прекращено раньше по другим причинам (т.е. не связанным собственно с boost::serialization).
У меня до сих пор довольно хорошее впечатление о boost::serialization, но использовать его в производствнном коде нельзя из-за проблем сопровождения (это ж надо было порушить обратную совместимость бинарных архивов).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.