Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
3 / 3 / 1
Регистрация: 14.08.2012
Сообщений: 78

Сохранение класса в файл и его чтение

17.03.2013, 00:08. Показов 1880. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
К примеру Human (главное то, что в нем есть string):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Human{    
public:
    string name;
};
 
int main(){
    Human h1, h2;
    h1.name = "john";
 
    FILE *fp;
    if((fp=fopen("1.bin", "wb+"))==NULL) {
        printf("Ошибка при открытии файла.\n");
        exit(1);
    }
 
    fwrite(&h1, sizeof(Human), 1, fp);
    rewind(fp);
    fread(&h2, sizeof(Human), 1, fp);
 
    cout << h2.name << endl;
        
        fclose(fp);
    return 0;
}
Сохранение и чтение происходит успешно, но при выходе из функции main, выходит окно с ошибкой, если использовать char вместо string, ошибки нет. Полагаю дело в деструкторе string name, если не правильно считывает.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.03.2013, 00:08
Ответы с готовыми решениями:

Сохранение и чтение объекта класса в файл/из файла
Добрый день! Столкнулся с проблемой сохранения объекта класса в файл, и последующего его чтения. Задача такая: имеем vector base, в...

Сохранение ArrayList в файл и его чтение
Привет! Имеется: List&lt;File&gt; mImg = new ArrayList&lt;&gt;(); File dir = new...

Сохранение текста из textbox и его чтение
Я придумал что то не вразумительное Stream l = new FileStream(&quot;login.txt&quot;, FileMode.OpenOrCreate, FileAccess.ReadWrite,...

7
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 00:29
Дело не в деструкторе, а в том, что объект string это не строка и поэтому здесь не подходит бинарное чтение/запись.
1
3 / 3 / 1
Регистрация: 14.08.2012
Сообщений: 78
17.03.2013, 00:40  [ТС]
и, что же, использовать char?

Добавлено через 6 минут
Как можно записать и считать объект string?
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 01:01
Не писать бинарно класс в файл. В классе сделать перегрузку операторов чтения\записи. В них прописать как читать\ записывать поля класса, используя при этом для string методы форматируемой записи (cout <<) и строкового чтения(функция getline()), которые умеют работать со string.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.03.2013, 04:12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <string>
 
class Human
{
    public:
        Human() : name_() {};
        Human(const std::string &name) : name_(name) {}
 
        const std::string & getName() const { return name_; }
        void setName (const std::string &name) { name_ = name; }
        void print() const { std::cout << "Name: " << name_ << std::endl; }
 
    protected:
        std::string name_;
};
 
// перегружаем поток вывода
std::ostream & operator<< (std::ostream &ost, const Human &h)
{
    ost << h.getName() << std::endl; // формируем поток
    return ost; // возвращаем поток
}
 
// перегружаем поток ввода
std::istream & operator>> (std::istream &ist, Human &h)
{
    std::string tmp;
    if (ist >> tmp) // считываем с потока, если удачно
        h.setName(tmp); // устанавливаем новое значение поля name
    return ist; // возвращаем поток
}
 
int main()
{
    Human h;
    std::cin >> h;
    std::cout << h;
    h.print();
    std::cout << "Good luck" << std::endl;
}
С файлами аналогично, только надо создать объекты ifstream/ofstream. В первом случае, проверить на успешность открытия файла (он попросту может не существовать).
1
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 12:20
Цитата Сообщение от MrGluck Посмотреть сообщение
// перегружаем поток ввода
std::istream & operator>> (std::istream &ist, Human &h)
{
std::string tmp;
if (ist >> tmp) // считываем с потока, если удачно
h.setName(tmp); // устанавливаем новое значение поля name
return ist; // возвращаем поток
}
Будет работать, только если строка из одного слова.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.03.2013, 16:46
alsav22, много у нас экзотичных имен, состоящих более чем из одного слова? Ни разу не видел, чтобы в поле name считывали гетлайном. Считаю, что замечание неуместно, тем более для показательного примера.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 17:41
Цитата Сообщение от MrGluck Посмотреть сообщение
alsav22, много у нас экзотичных имен, состоящих более чем из одного слова? Ни разу не видел, чтобы в поле name считывали гетлайном. Считаю, что замечание неуместно, тем более для показательного примера.
В том-то и дело, что пример показательный. Что будет в классе ТС в поле name неизвестно (может имя и фамилия вместе), поэтому и сделал уточнение (исключительно для ТС), чтобы он это учёл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.03.2013, 17:41
Помогаю со студенческими работами здесь

Чтение файла с сервера и сохранение его устройство
Есть код: var s:TStringStream; begin s:=TstringStream.Create; idHTTP1.Get('http://сайт.net/файл.txt',s); ...

Чтение и сохранение в файл
Добрый день! Помогите делаю прогу, к-я по входным параметрам a,b,c вычисляет x,y,z.(компоненты LabeledEdit). Данные ввожу в форме. Все...

Чтение и сохранение из/в файл
Добрый день. Требуется дополнение к коду. Нужно читать элементы из файла в динамический массив и сохранение после сортировки. #include...

Матрица: чтение и сохранение в файл
Есть двумерный массив, записанный в файле как матрица размерности 12*4. Необходимо считать ее, произвести определенные действия и записть...

Чтение из файла и сохранение в файл
Здравствуйте. Работаю с текстовым файлом формата .txt. Считывается текст из файла, который затем встраивается в аудиофайл. Затем...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru