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

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

Восстановить пароль Регистрация
 
SimplySorc
1 / 1 / 0
Регистрация: 14.04.2013
Сообщений: 34
21.12.2013, 20:36     Запись объектов в файл #1
Существует класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string>
#include <iostream>
using namespace std;
#pragma once
class BD
{
private: string ClientName,ClientSurname,ClientPatr,ClientAddress,BankName,Country;
         int ClientDeposit,BankPercenage;
public:
    BD(void);
    ~BD(void);
    void Show(void);
    void Set(void);     
    }
    
};
Каким образом можно записать в файл этот класс?(точнее придется записывать массив классов). Я нагуглил что-то вроде этого
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//
 
#include "stdafx.h"
#include "BD.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (LC_ALL,".1251");
    BD *a=new BD;
    FILE *file;
    file=fopen("C:\\1.txt", "w");
    fprintf(file,"%d", a[0]); //здесь ошибка
    system("pause");
    return 0;
}
но получаю ошибку во время выполнения программы*слышен сам звук и программа зависает). Подскажите, пожалуйста, что я сделал не так.
PS это визуал С
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
21.12.2013, 20:40     Запись объектов в файл #2
Сначала определи в каком формате ты собираешься это все сохранять в файл.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 20:41     Запись объектов в файл #3
Используете string и функции С. Что-то одно выберите: или С, или С++. В полях класса string, поэтому нужно писать объекты полями. Можно переопределить в классе операторы >> и <<, и в них прописать, как записывать и читать поля класса в файл.
Убежденный
Системный программист
 Аватар для Убежденный
14209 / 6224 / 987
Регистрация: 02.05.2013
Сообщений: 10,374
Завершенные тесты: 1
21.12.2013, 20:43     Запись объектов в файл #4
C++
1
2
3
4
5
BD *a=new BD;
 
// ...
 
fprintf(file,"%d", a[1]);
Этот фрагмент кода попадает под статью под названием "RTFM".
Конечно, здесь ошибка, т.к. a - это не массив, да и вообще в C/C++
индексы элементов нумеруются, начиная с нуля, а не единицы.

Цитата Сообщение от SimplySorc Посмотреть сообщение
Каким образом можно записать в файл этот класс?
Сохранить все члены класса в файл, с учетом их типа.
Например, строки (string) сохранять так: сначала длину, затем содержимое.
Загрузка из файла выполняется в обратном порядке. И для таких задач гораздо
удобнее использовать готовые библиотеки, такие как Boost.Serialization.
Код в итоге упрощается до нескольких строк.
SimplySorc
1 / 1 / 0
Регистрация: 14.04.2013
Сообщений: 34
21.12.2013, 20:48  [ТС]     Запись объектов в файл #5
Цитата Сообщение от Убежденный Посмотреть сообщение
[cpp]
Сохранить все члены класса в файл, с учетом их типа.
Например, строки (string) сохранять так: сначала длину, затем содержимое.
а можно пример как записать(и прочитать) одну из переменных?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 20:50     Запись объектов в файл #6
Цитата Сообщение от Убежденный Посмотреть сообщение
Например, строки (string) сохранять так: сначала длину, затем содержимое.
Убежденный, что это даст по сравнению с форматируемой записью?
SimplySorc
1 / 1 / 0
Регистрация: 14.04.2013
Сообщений: 34
21.12.2013, 21:16  [ТС]     Запись объектов в файл #7
я находил такой пример, но здесь мне непонятны несколько вещей.
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
#include <iostream>
#include <fstream>
 
class my {
    int a;
    float b;
    char c[30];
    public:
    friend std::ostream& operator<<(std::ostream& o, my& x){
        std::cout<<"a= "<<x.a<<", b= "<<x.b<<", c= "<<x.c;// я так понял это можно опустить т.к.
// это просто выведет на экран что я записал в файл(пока файл будет записываться)
    }
    void create(){
        std::cout<<"a = "; std::cin>>a;
        std::cout<<"b = "; std::cin>>b; std::cin.ignore();
        std::cout<<"c = "; std::cin.getline(c, 30);
        std::cout<<*this<<" created\n";
    }
};
 
int main (){
    my o, o1;
    o.create();
    std::ofstream ofs("text.txt", std::ios::binary); //"ofs" - эта переменная берется из ниоткуда 
//будь вместо нее "о" я бы еще понял, а при текущей записи у меня ругается компилятор.
    ofs.write(reinterpret_cast<char*>(&o), sizeof(o));
    ofs.close();
    std::ifstream ifs("text.txt", std::ios::binary);// ifs тоже слишком внезапна для меня
    if(!ifs){std::cerr<<"File not found"; return 1;}
    ifs.read(reinterpret_cast<char*>(&o1), sizeof(o1));
    ifs.close();
    std::cout<<"o1: "<<o1<<"\n";
}
может кто нибудь объяснить где я ошибаюсь?

Добавлено через 9 минут
разобрался с "внезапными переменными" просто я забыл поставить #include <fstream>
но вопрос о том, что делают эти строки
C++
1
2
3
friend std::ostream& operator<<(std::ostream& o, my& x){
        std::cout<<"a= "<<x.a<<", b= "<<x.b<<", c= "<<x.c;
    }
остается открытым, как собсна и вопрос, а что делает эта строка
C++
1
ofs.write(reinterpret_cast<char*>(&o), sizeof(o));
что это запись в файл я понимаю, но что это за "reinterpret_cast<char*>(&o)" я не понимаю
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 21:23     Запись объектов в файл #8
Цитата Сообщение от SimplySorc Посмотреть сообщение
я находил такой пример,
Для вашего класса этот код не подходит (в нём нет 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
 
class BD
{
public: 
         string ClientName,
                ClientSurname,
                ClientPatr,
                ClientAddress,
                BankName,
                Country;
            int ClientDeposit,
                BankPercenage;
 
    BD(){}
    ~BD(){}
    friend ofstream& operator<<(ofstream& fout, const BD& obj)
    {
        fout << obj.ClientName << endl;
        fout << obj.ClientSurname << endl;
        fout << obj.ClientPatr << endl;
        fout << obj.ClientAddress << endl;
        fout << obj.BankName << endl;
        fout << obj.Country << endl;
        fout << obj.ClientDeposit << endl;
        fout << obj.BankPercenage << endl;
        
        return fout;
    }
 
    friend ifstream& operator>>(ifstream& fin, BD& obj)
    {
        getline(fin, obj.ClientName);
        getline(fin, obj.ClientSurname);
        getline(fin, obj.ClientPatr);
        getline(fin, obj.ClientAddress);
        getline(fin, obj.BankName);
        getline(fin, obj.Country);
        fin >> obj.ClientDeposit;
        fin >> obj.BankPercenage;
        fin.get();
        
        return fin;
    }
    
    void Show(){}
    void Set(){}     
};
 
int main()
{
    BD *a = new BD[2];
    a[0].ClientName = "AAA AAA";
    a[0].ClientSurname = "BBB BBB";
    a[0].ClientPatr = "CCC CCC";
    a[0].ClientAddress = "DDD DDD";
    a[0].BankName = "EEE EEE";
    a[0].Country = "FFF FFF";
    a[0].ClientDeposit = 1;
    a[0].BankPercenage = 2;
 
    a[1].ClientName = "AAA A";
    a[1].ClientSurname = "BBB B";
    a[1].ClientPatr = "CCC C";
    a[1].ClientAddress = "DDD D";
    a[1].BankName = "EEE E";
    a[1].Country = "FFF F";
    a[1].ClientDeposit = 2;
    a[1].BankPercenage = 3;
    
   
    ofstream fout("C:\\1.txt");
    for (int i = 0; i < 2; ++i)
        fout << a[i];
    fout.close();
 
    ifstream fin("C:\\1.txt");
    if (!fin) cout << "Error!" << endl;
    else
    {
        BD temp;
        while (fin >> temp)
            temp.Show();
 
        fin.close();
    }
    
    system("pause");
    return 0;
}
Убежденный
Системный программист
 Аватар для Убежденный
14209 / 6224 / 987
Регистрация: 02.05.2013
Сообщений: 10,374
Завершенные тесты: 1
21.12.2013, 22:29     Запись объектов в файл #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Убежденный, что это даст по сравнению с форматируемой записью?
Ничего. Было предложено в качестве примера (одного из многих возможных).
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
21.12.2013, 22:45     Запись объектов в файл #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Убежденный, что это даст по сравнению с форматируемой записью?
Возможность сохранения мультистрочных стрингов (и со всякими спецсимволами).
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 23:39     Запись объектов в файл #11
Цитата Сообщение от Nekto Посмотреть сообщение
Возможность сохранения мультистрочных стрингов (и со всякими спецсимволами).
Что за "мультистрочные стринги"?
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
22.12.2013, 00:03     Запись объектов в файл #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Что за "мультистрочные стринги"?
std::string address("state \n city ... \n street \n postcode \n smthmore");
alsav22
22.12.2013, 00:33
  #13

Не по теме:

Цитата Сообщение от Nekto Посмотреть сообщение
std::string address("state \n city ... \n street \n postcode \n smthmore");
Откуда такие "мультистринги" берутся?
Цитата Сообщение от alsav22 Посмотреть сообщение
(и со всякими спецсимволами)
Намёк на то, что нельзя будет использовать никакого символа-разделителя при чтении?

Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
22.12.2013, 00:48     Запись объектов в файл #14
Цитата Сообщение от alsav22 Посмотреть сообщение

Не по теме:


Откуда такие "мультистринги" берутся?

Намёк на то, что нельзя будет использовать никакого символа-разделителя при чтении?

Не по теме:

Мало ли откуда Стринг не обязан быть одной строчкой.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2013, 00:57     Запись объектов в файл
Еще ссылки по теме:

C++ Сериализация объектов с полями std::string + запись/чтение в файл
Запись объектов в файл C++
Запись объектов в файл C++

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

Или воспользуйтесь поиском по форуму:
alsav22
22.12.2013, 00:57     Запись объектов в файл
  #15

Не по теме:

Цитата Сообщение от Nekto Посмотреть сообщение
Мало ли откуда
Мало, ни мало... Я к тому, что может проще их не создавать, вместе с лишними проблемами?
Цитата Сообщение от Nekto Посмотреть сообщение
Стринг не обязан быть одной строчкой.
А "строчка" - это что?

Yandex
Объявления
22.12.2013, 00:57     Запись объектов в файл
Ответ Создать тему
Опции темы

Текущее время: 12:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru