Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
1

Запись объектов в файл

07.09.2015, 13:49. Показов 2430. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Могут ли возникнуть проблемы при считывании объекта (функцией read), если перед этим в файл были записаны объекты такого класса:
C++
1
2
3
4
5
6
7
class Obj1
{
  int len;
  char* str;
public:
  //всякие методы
}
или
C++
1
2
3
4
5
6
7
class Obj1
{
  int pff;
  string str;
public:
  //всякие методы
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2015, 13:49
Ответы с готовыми решениями:

Запись объектов в файл
Пишу сейчас 2д игру на С++, нужно сделать таблицу рекордов, думаю сделать какую нибудь структуру...

Запись объектов в файл
Существует класс #include <string> #include <iostream> using namespace std; #pragma once...

Запись объектов в файл
Как в с++ реализовать запись масива класов в файл?

Запись объектов в файл и чтение
#include <fstream.h> #include <iostream.h> #include <conio.h> #include <string.h> class my {...

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
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Могут ли возникнуть проблемы
Если имеется в виду побайтовая запись объектов таких структур, то не "могут", а возникнут обязательно.
1
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
07.09.2015, 13:52 4
Все зависит от реализации.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
07.09.2015, 13:54  [ТС] 5
т.е. для записи файл текста неопр. длины нужно использовать фиксированный массив на большое число элементов?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
07.09.2015, 13:56 6
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
т.е. для записи файл текста неопр. длины нужно использовать фиксированный массив на большое число элементов?
Зависит от задачи. В общем виде ответ такой:
"нужно использовать сериализацию".
Применительно к данным классам, можно сперва в файл записать размер строки, потом саму строку. При считывании данных, получить из файла размер строки, выделить необходимый буфер, считать в него строку из файла.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
07.09.2015, 13:57 7
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
т.е. для записи файл текста неопр. длины нужно использовать фиксированный массив на большое число элементов?
Еще раз - все зависит от реализации. Вполне можно разместить в начале файла указатели на содержимое строк.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
07.09.2015, 13:58 8
Цитата Сообщение от Ilot Посмотреть сообщение
Вполне можно разместить в начале файла указатели на содержимое строк.
И куда они будут указывать, когда мы их считаем?
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
07.09.2015, 14:01  [ТС] 9
Цитата Сообщение от DrOffset Посмотреть сообщение
"нужно использовать сериализацию".
Понятно, этот метод мне напомнил ситуацию с чтением объектов базового и произв. классов, когда они записаны в одном файле.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
07.09.2015, 14:08 10
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
т.е. для записи файл текста неопр. длины нужно использовать фиксированный массив на большое число элементов?
1) Сначала записывается размер, потом сам текст.
2) В файл пишется C строка, которая заканчивается классическим нулевым символом. Понятное дело, сам текст этого нулевого символа содержать не может. Хотя, слабо себе представляю зачем он вам может там понадобиться.
3) Строка пишется в файл через << и заканчивается символом перевода строки. Многострочный текст так не сохранишь, но оно вам точно надо? Для записи какого ни будь ФИО и так сойдет, а вам геморрою меньше.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
07.09.2015, 14:33 11
Цитата Сообщение от DrOffset Посмотреть сообщение
И куда они будут указывать, когда мы их считаем?
Указатели не всмысле указателей в С++, а указатели на позицию с которой начинается строка (читай смещения).
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

Не по теме:

Цитата Сообщение от Ilot Посмотреть сообщение
Указатели не всмысле указателей в С++, а указатели на позицию с которой начинается строка (читай смещения).
Я понял. Тогда да - это возможно. Правда новички в этом разделе могли тебя неверно понять. Хорошо, что уточнил :)



Добавлено через 25 минут
Цитата Сообщение от JuniorCpp Посмотреть сообщение
Прошу прощения, но не много не понимаю, зачем это надо?
Что именно? Данные в файл сохранять?
Цитата Сообщение от JuniorCpp Посмотреть сообщение
И что значит читать объект из файла?
Считать из файла некоторую структуру данных, которая потом может быть представлена как состояние объекта в программе.
В игры играешь? Вот пример:
Вот есть файл сохраненной игры, в нем записаны параметры твоего героя на момент времени. При загрузке - файл читается, а в программе создается объект "герой", к которому применяются сохраненные параметры из файла. Это если очень упрощенно.
0
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 18
07.09.2015, 15:11 14
Цитата Сообщение от DrOffset Посмотреть сообщение

Не по теме:


Я понял. Тогда да - это возможно. Правда новички в этом разделе могли тебя неверно понять. Хорошо, что уточнил :)



Добавлено через 25 минут

Что именно? Данные в файл сохранять?

Считать из файла некоторую структуру данных, которая потом может быть представлена как состояние объекта в программе.
В игры играешь? Вот пример:
Вот есть файл сохраненной игры, в нем записаны параметры твоего героя на момент времени. При загрузке - файл читается, а в программе создается объект "герой", к которому применяются сохраненные параметры из файла. Это если очень упрощенно.
Все понял, спасибо)

От себя могу предложить такой вариант, запись данных структуры/класса в формат типа CSV.
А потом написать интерфес записи/чтения из этого файла.
param1;param2;...;paramN

Ну думаю не стоит объяснять что такое CSV)
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.09.2015, 15:24 15
Гуглим выражение "сериализация классов".
Можно использовать boost/serialization (и сериализовать к примеру в xml), а можно сериализовать самому "руками".
В любом случае сохранять "как есть" и вообще в двоичных форматах не очень хорошо.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
07.09.2015, 17:41  [ТС] 16
DrOffset, Ilot,
А как считать все объекты корректно (с помощью ф-ции read целиком весь объект), если эти объекты занимают разное кол-во байт (в каком-то объекте строка длиннее, а каком-то короче).
Или нужно считывать поля объекта поэлементно через >> , зная информацию о длине строки?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
07.09.2015, 19:30 17
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Или нужно считывать поля объекта поэлементно через >> , зная информацию о длине строки?
Да. Но не обязательно через >>. Если потребуется, то можно и более низкоуровневыми функциями воспользоваться.
Если волнует вопрос скорости, то можно считывать разом в небольшой фиксированный буфер в памяти, а потом уже из этот буфер разбирать на объекты. Кончились данные в буфере - считываем следующий кусок и т.д. Подумать как организовать "склейку объектов", которые пришлись на границу этих кусков, тебе предлагаю самостоятельно.

Как выше упомняли, существуют всякие библиотеки сериализации, которые умеют формировать и разбирать в разные форматы, начиная от собственных (например формат google::protobuf) и заканчивая общеупотребимыми (xml, json и т.п.). Так что для полной картины с ним ознакомиться тоже полезно. Велосипедить такое далеко не всегда можно и нужно.
0
07.09.2015, 19:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2015, 19:30
Помогаю со студенческими работами здесь

Запись в файл массива объектов
уже 3 часа мучаюсь, не могу записать у файл массив обьектов. у меня есть Redactor...

Запись и чтение динамических объектов в файл
Как быть, че делать? Особенно при чтение файла, ведь неизвестно какого он размера. И как бы все это...

Запись в файл объектов структуры TrainInfo
Программа записывает в файл объекты структуры TrainInfo. Если нужно выводит нужный поезд. При...

Запись и чтение объектов класса в файл С ++
Здравствуйте! Вчера писала сюда по поводу динамического массива, где мне помогли. Сегодня...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru