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

Обновлено: 07.07.2024

Дан файл «Input.txt», в котором каждая строка имеет значения, аналогичные переменным экземпляра класса.
Прочитайте значения в объект класса и выполните необходимые операции.

using namespace std;


// Класс для определения свойств

int Age, Ratings;

// Объявление функции input () для ввода информации

// Объявление функции output_highest_rated () для

// извлекать информацию из файла базы данных


// Определение функции input () для ввода информации

// Объект для записи в файл

// Открытие файла в режиме добавления

file_obj.open( "Input.txt" , ios::app);

// Объект участника класса для ввода данных в файл

// Подача соответствующих данных в переменные

string str = "Micheal" ;

int age = 18, ratings = 2500;

// Назначение данных в объект

// Запись данных объекта в файл

file_obj.write(( char *)&obj, sizeof (obj));

// Подача соответствующих данных в переменные

// Назначение данных в объект

// Запись данных объекта в файл

file_obj.write(( char *)&obj, sizeof (obj));


// Определение функции output_highest_rated () для
// извлекать информацию из файла базы данных

// Объект для чтения из файла

// Открытие файла в режиме ввода

file_obj.open( "Input.txt" , ios::in);

// Объект участника класса для ввода данных в файл

// Чтение из файла в объект "obj"

file_obj.read(( char *)&obj, sizeof (obj));

// максимум, чтобы сохранить максимальные оценки

// Highest_rated хранит имя участника с самым высоким рейтингом

// Проверяем, пока у нас нет корма

// Назначаем максимальные рейтинги

if (obj.Ratings > max)

file_obj.read(( char *)&obj, sizeof (obj));

// Выход - участник с самым высоким рейтингом

// Создание объекта класса

// Извлечение участника с максимальным рейтингом

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Запись объекта класса в файл
Здравствуйте, может кто-нибудь помочь с данным вопросом? Как мне записать в файл строку, которая.


Запись объекта класса в файл
Доброго времени суток! нужно сохранить объект вот такого класса: class Act < public: .


Запись и чтение объекта класса в файл и из файла
У меня есть std::list состоящий из объектов типа Person это база о людях. Нужно реализовать два.

Решение

Добавлено через 22 минуты
Полезные штуки про read и write.

А еще, если ты хочешь массив писать на файл, то я бы на твоем месте записал каждый объект построчно, так и читать удобно через код, и выглядит красиво в файле.

Что-то на подобии этого я имею ввиду:

И может ли чтение уже вычисленных данных этого типа из файла и совершение операции над этими данными увеличить скорость,по сравнению с тем, если бы я сначала вычислял эти данные в программе,а потом применял операцию между элементами. (То есть в файле уже будут хранится нужные вычисленные элементы, останется только считать и выполнить операцию между ними. ) А на этот вопрос не отвечу, потому что его не понял сори А на этот вопрос не отвечу, потому что его не понял сори

Такс, описанный выше пример это примерные поля моего класса.
Класс является неким представлением чисел с плавающей точкой (double).
Что я делал раньше, вычислял в цикле выражения,которые имеют тип double,далее типы double эти переводил к моему типу myClass допустим, и выполнял операцию между ними определенную для класса myClass.В итоге получал результат типа myClass.

Теперь я хочу не вычислять в цикле выражения типа double и не переводить к типу myClass,а сразу записать в файл нужные элементы типа myClass.То есть в файле хранятся элементы типа myClass.
Потом отдельно я что делаю,читаю данные с файла и выполняю над ними операцию! (То есть не делаю вычисления и приведения к типу myClass).
Вот и вопрос работа с файлом быстро происходит?Смогу ли я выиграть время,по сравнению с вычислением и приведением к типу.

Как реализовать запись объектного Array List в файл: txt или xml. Пожалуйста, разъясните это на конкретных примерах. Делаю курсовую по ООП на Java. Имеется следующий код:

Класс User отвечает за создание самого объекта типа User.

В классе Users создаётся объектный ArrayList для User. Для дальнейшего динамического использования. Вывод через байтовый поток.

Проблема заключается в том, что после добавление конструктора.

Для создание экземпляра Users users = new Users(); (который мы потом записываем файл в методе SaveUser(), так же он используется в меню для вызова функций добавления, удаления и вывода всех пользователей) вылезает такая ошибка:

constructor Users in class Users cannot be applied to given types; required: ArrayList,int found: no arguments reason: actual and formal argument lists differ in length

Я не понимаю какие формальные параметры использовать.. для этого экземпляра. И будет ли потом программа правильно выполнять сериалилизацию моего списка с объектами User, а не сам пустой список.

Первый раз слышу о таком, но как я понял из разряда стиля программирования. Я учусь на 2 курсе, основной язык у нас с++, но курсовую можно было выбрать на любом ооп языке, я склонился к java, потому что java интуитивнее, так-как память полностью управляется jvm. И к тому же большинство своего свободного времени я отдаю музыке. GenCloud а какой смысл в файл записывать имена ссылок?Если мы возьмем с ArrayList<User> объект user и запишем таким образом,как показано в твоей ссылке,то запишутся название ссылок,а не объекты @Sckoriy , это один из примеров того как можно записать коллекцию в файл, а не готовое решение. А если еще ниже посмотреть, то для особо одаренных написано, что можно использовать объектные потоки ввода/вывода

Для того,чтобы записать класс Users со всеми его переменными экземпляра,вам нужно использовать сериализацию объекта. Сериализация - это как бы записанный(сжатый) объект.Вот представьте себе надувную фигуру. Вы можете спустить надувную фигуру и положить в коробку,например.А если бы вы этого не сделали,то надутая фигура вряд-ли поместиться в маленькую коробочку.

Спустить фигуру и положить в коробку - Сериализация

Вытянуть фигуру и надуть её - ДИсериализация

Как бы,можно сохранить данные объекта(состояние,переменные экземпляры) в txt и сделать конструктор,чтобы передавать построчно параметры для НОВОГО объекта.Но вам нужно другое. Именно "сдуть" объект и положить в файлик.Сделать это можно следующим образом :

Класс Объекта,который будут спускать(сериализовать) должен реализовать интерфейс Serializable

А теперь внимательно!

Для того,чтобы сериализовать объект со всеми его полями(переменными экземпляра) НУЖНО чтобы все его объектные ссылки тоже реализовали интерфейс Serializable

Большинство классов за вас уже реализуют интерфейс Serializable,а некоторые не могут вообще.

Для того,чтобы записать объект Users в файл,нам нужно использовать потоки поток соединения - простой байтовый поток(FileInputStream(входящий) , FileOutputStream(исходящий).

И потоки,в которые мы будем впихать объекты,а там они будут сжиматься или надуваться : ObjectInputStream(входящий-надуваем) ObjectOutputStream(Исходящий-сдуваем).

В данном примере я записал в файл объект Users , который содержит ArrayList Ибо,если вы запишете только ArrayList users объект в файл,то какая от этого польза,Если у вашем классе Users нету конструктора или какого-то метода,чтобы принимал объект ArrayList users.

А все нужные вам методы находятся в классе Users. Чтобы был смысл записывать ArrayList нужно сделать следующее:

Респект Harry - смотрю, часто отвечает. Плиз, поясните, а почему вообще возникает проблема со считыванием полей класса string? Подозреваю, из-за непредсказуемой длины строк, но хотелось бы знать точно.

Именно поэтому Harry советует записывать предварительно длину в инт/переменную и считывать каждое поле класса отдельно?

И еще одно уточнение - значит, методы write/read из библиотек fstream'а можно использовать только для классов со стандартными полями (типа int, double) а для string и char* нужно писать переопределённые методы/друж-функции?

Есть такое понятие - сериализация. Как раз и занимается тем что превращает объекты в нечто, что можно записать в файл, а потом оттуда восстановить. Можно, например, сериализовать в JSON, и записывать в текст, а можно использовать Google Protobuf, и тогда в бинарном виде сохранить объект Строку - если это чисто текстовая строка - можно и писать-читать до нулевого заключительного символа. Но string в общем случае может содержать и нулевые символы. Поэтому приходится хранить и длину строки, и содержимое.

Давайте рассмотрим, что такое класс string, но в пока в идеализированном состоянии. Это просто структура, которая хранит размер строки, указатель на нее и емкость строки (то есть, реальный размер буфера, на который указывает строка).

В этот момент уже должно быть тревожно - там есть указатель! И сохраняя просто переменную типа string в файл как структуру (а ее размер оказывается обычно 32 байта), мы сохраняем размер, емкость (capacity) и указатель. После перезапуска программы этот указатель будет показывать в пустоту или куда то, где об этом не будут знать.

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

Почему иногда это все таки работает, не смотря на указатель? Во первых, часто тестируют не закрывая программу. В этом случае есть большая вероятность (ещё раз - гарантий нет, а только вероятность), что данные по указателю не будут испорчены.

Во вторых, есть такая штука, как SSO - small string optimization - оптимизация маленьких строк. Если строка небольшого размера (5-10 символов), то ее можно вместить прямо внутри структуры там, где хранится указатель-емкость. В теории можно запихнуть до 31 байта (если вся структура 32 байта - один битик нужен как флажок). И вот такая строка должна сохраниться и восстановится нормально - у нее нет "внешних буферов".

Теперь перейдем ближе к вопросу. Так как размер string в байтах не меняется (а иначе было бы невозможно объявить переменную класса типа string - компилятор бы не знал, сколько памяти выделять), то и при десериализации нужно знать размер строки, чтобы знать, сколько читать.

методы write/read из библиотек fstream'а можно использовать только для классов со стандартными полями (типа int, double) а для string и char* нужно писать переопределённые методы/друж-функции?

этими функциями можно писать pod типы. А string таким не является. (точнее, он иногда может быть таким - sso). По другому - если переменные класса не являются явными или неявными указателями (класс/структура имеет внешние данные), то для такого типа нужно писать специализированный сериализатор/десериализатор).

Читайте также: