Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
jon_illien
2 / 2 / 1
Регистрация: 14.08.2012
Сообщений: 78
#1

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

17.03.2013, 00:08. Просмотров 969. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2013, 00:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сохранение класса в файл и его чтение (C++):

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

Работа со структурой данных, чтение/сохранение во внешний файл - C++
помогите разобраться с задачкой!! {Написать программу, представляющую собой простейшую систему для управления данными. Исходные данные...

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

Не работает метод класса (запись и чтение в файл) - C++
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; using namespace std; class Lines { private: char *line;

Добавить вывод в файл и чтение из файла объектов класса - C++
Добавить вывод в файл и чтение из файла объектов класса. Работа должна отображаться на мониторе. Прошу не много подсабить. #include...

Вывод в файл и последующее чтение из файла объектов класса - C++
Как наиболее правильно и канонично выводить (так чтобы потом ещё и прочитать) объекты классов в файл? Представим ситуацию: Есть класс...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 00:29 #2
Дело не в деструкторе, а в том, что объект string это не строка и поэтому здесь не подходит бинарное чтение/запись.
1
jon_illien
2 / 2 / 1
Регистрация: 14.08.2012
Сообщений: 78
17.03.2013, 00:40  [ТС] #3
и, что же, использовать char?

Добавлено через 6 минут
Как можно записать и считать объект string?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 01:01 #4
Не писать бинарно класс в файл. В классе сделать перегрузку операторов чтения\записи. В них прописать как читать\ записывать поля класса, используя при этом для string методы форматируемой записи (cout <<) и строкового чтения(функция getline()), которые умеют работать со string.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
17.03.2013, 04:12 #5
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
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 12:20 #6
Цитата Сообщение от MrGluck Посмотреть сообщение
// перегружаем поток ввода
std::istream & operator>> (std::istream &ist, Human &h)
{
std::string tmp;
if (ist >> tmp) // считываем с потока, если удачно
h.setName(tmp); // устанавливаем новое значение поля name
return ist; // возвращаем поток
}
Будет работать, только если строка из одного слова.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
17.03.2013, 16:46 #7
alsav22, много у нас экзотичных имен, состоящих более чем из одного слова? Ни разу не видел, чтобы в поле name считывали гетлайном. Считаю, что замечание неуместно, тем более для показательного примера.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 17:41 #8
Цитата Сообщение от MrGluck Посмотреть сообщение
alsav22, много у нас экзотичных имен, состоящих более чем из одного слова? Ни разу не видел, чтобы в поле name считывали гетлайном. Считаю, что замечание неуместно, тем более для показательного примера.
В том-то и дело, что пример показательный. Что будет в классе ТС в поле name неизвестно (может имя и фамилия вместе), поэтому и сделал уточнение (исключительно для ТС), чтобы он это учёл.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2013, 17:41
Привет! Вот еще темы с ответами:

Запись массива в файл и его чтение - C++
Помогите, пожалуйста: надо записать в файл массив из, например, 10 элементов, вычисляющихся как f=f+1, например. Затем считать полученные...

Чтение массива из файла, его преобразование и запись в другой файл - C++
Всем привет. Есть вот такой код: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;fstream&gt; #include &lt;string&gt; using...

Как открыть файл на чтение и запись, создав его, если его не существует, и перезаписать, если он существует? - C++
Как открыть файл на чтение и запись, создав его, если его не существует, и перезаписать, если он существует?

сохранение/чтение map<string,string*> в файл - C++
Доброго времени суток, Нужно сделать БД для индексации содержимого текстовых файлов, сначала решил, что все просто: читаем файл и...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.03.2013, 17:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru