1 | |||||||||||
Запись объектов в файл07.09.2015, 13:49. Показов 2430. Ответов 16
Метки нет (Все метки)
Могут ли возникнуть проблемы при считывании объекта (функцией read), если перед этим в файл были записаны объекты такого класса:
0
|
07.09.2015, 13:49 | |
Ответы с готовыми решениями:
16
Запись объектов в файл Запись объектов в файл Запись объектов в файл Запись объектов в файл и чтение |
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
|
07.09.2015, 13:52 | 2 |
Смотря как записаны. Указатель нельзя записывать как есть, только содержимое, на которое он указывает. Тоже касается string.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
07.09.2015, 13:52 | 3 |
Если имеется в виду побайтовая запись объектов таких структур, то не "могут", а возникнут обязательно.
1
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
07.09.2015, 13:56 | 6 |
Зависит от задачи. В общем виде ответ такой:
"нужно использовать сериализацию". Применительно к данным классам, можно сперва в файл записать размер строки, потом саму строку. При считывании данных, получить из файла размер строки, выделить необходимый буфер, считать в него строку из файла.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
07.09.2015, 13:58 | 8 |
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
07.09.2015, 14:08 | 10 |
1) Сначала записывается размер, потом сам текст.
2) В файл пишется C строка, которая заканчивается классическим нулевым символом. Понятное дело, сам текст этого нулевого символа содержать не может. Хотя, слабо себе представляю зачем он вам может там понадобиться. 3) Строка пишется в файл через << и заканчивается символом перевода строки. Многострочный текст так не сохранишь, но оно вам точно надо? Для записи какого ни будь ФИО и так сойдет, а вам геморрою меньше.
0
|
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 18
|
|
07.09.2015, 14:37 | 12 |
Прошу прощения, но не много не понимаю, зачем это надо?
И что значит читать объект из файла?
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
07.09.2015, 15:05 | 13 |
Не по теме: Я понял. Тогда да - это возможно. Правда новички в этом разделе могли тебя неверно понять. Хорошо, что уточнил :) Добавлено через 25 минут Что именно? Данные в файл сохранять? Считать из файла некоторую структуру данных, которая потом может быть представлена как состояние объекта в программе. В игры играешь? Вот пример: Вот есть файл сохраненной игры, в нем записаны параметры твоего героя на момент времени. При загрузке - файл читается, а в программе создается объект "герой", к которому применяются сохраненные параметры из файла. Это если очень упрощенно.
0
|
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 18
|
|
07.09.2015, 15:11 | 14 |
Все понял, спасибо)
От себя могу предложить такой вариант, запись данных структуры/класса в формат типа CSV. А потом написать интерфес записи/чтения из этого файла. param1;param2;...;paramN Ну думаю не стоит объяснять что такое CSV)
0
|
07.09.2015, 15:24 | 15 |
Гуглим выражение "сериализация классов".
Можно использовать boost/serialization (и сериализовать к примеру в xml), а можно сериализовать самому "руками". В любом случае сохранять "как есть" и вообще в двоичных форматах не очень хорошо.
0
|
07.09.2015, 17:41 [ТС] | 16 |
DrOffset, Ilot,
А как считать все объекты корректно (с помощью ф-ции read целиком весь объект), если эти объекты занимают разное кол-во байт (в каком-то объекте строка длиннее, а каком-то короче). Или нужно считывать поля объекта поэлементно через >> , зная информацию о длине строки?
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
07.09.2015, 19:30 | 17 |
Да. Но не обязательно через >>. Если потребуется, то можно и более низкоуровневыми функциями воспользоваться.
Если волнует вопрос скорости, то можно считывать разом в небольшой фиксированный буфер в памяти, а потом уже из этот буфер разбирать на объекты. Кончились данные в буфере - считываем следующий кусок и т.д. Подумать как организовать "склейку объектов", которые пришлись на границу этих кусков, тебе предлагаю самостоятельно. Как выше упомняли, существуют всякие библиотеки сериализации, которые умеют формировать и разбирать в разные форматы, начиная от собственных (например формат google::protobuf) и заканчивая общеупотребимыми (xml, json и т.п.). Так что для полной картины с ним ознакомиться тоже полезно. Велосипедить такое далеко не всегда можно и нужно.
0
|
07.09.2015, 19:30 | |
07.09.2015, 19:30 | |
Помогаю со студенческими работами здесь
17
Запись в файл массива объектов Запись и чтение динамических объектов в файл Запись в файл объектов структуры TrainInfo Запись и чтение объектов класса в файл С ++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |