Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 13
1

Чтение данных для объекта класса из файла

13.08.2019, 20:29. Показов 1472. Ответов 9
Метки нет (Все метки)

Доброе время суток, подскажите метод как прочитать из бинарного файла некий текст в обьект своего класса, поле которого содержит vector<string> text={"значение по умолчанию"};
то что я написал вызывает ошибку :const size_type _Right_size = _Right_data._Mysize;
заголовочник,
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
#pragma once
#include<vector>
#include<string>
#include<fstream>
using namespace std;
 
class Zapis
{
private:
    
public:
    vector <string> text;
    size_t siZap = 0;
    size_t res = 0;
        void raz();
    Zapis();
    void show();
    void setzap(vector<string> a);
    void NewSet();
    virtual ~Zapis();
    
    friend ostream& operator << (ostream&stream, Zapis ob);
    friend istream& operator >> (istream&stream, Zapis& ob);
 
};
сам класс
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
Zapis::Zapis()
{
    text={ "значение не заданно" };
}
void Zapis::show() {
    for (auto l : text) {
        cout << l << " ";
    }
}
void Zapis::raz() {
    for (auto h : text) {
        for (auto d : h) {
        siZap++;
        }
    }
 
}
void Zapis::NewSet()
{
    string s, t = "";
    vector <string> g;
    getline(cin, s);
    s = s + ' ';
    for (auto c : s) {
        if (c != ' ')
            t = t + c;
        else {
            if (t != " ")
                g.push_back(t);
            t = "";
        }
    }
    this->text = g;
}
 
void Zapis::setzap(vector<string>a) {
    this-> text=a;
}
ostream& operator << (ostream&stream, Zapis ob)
{
    for (auto h : ob.text) {
    stream << h << endl;
     }
    return stream;
}
istream& operator >> (istream&stream, Zapis& ob)
{
    for (auto f : ob.text) {
    stream >> f;
}
    return stream;
}
сохранил в файл три объекта вот таким образом:

C++
1
2
3
4
5
6
7
8
ofstream zap;
    zap.open("save",ofstream::app);
    if (!zap.is_open()) {
        cout << "неудалось открыть файл!" << endl;
    }
    else {
          cout << "все норм открыт! читаем" << endl;
           zap.write((char*)&obj, sizeof(Zapis));
как считать их по одному?
далее уже помещаю в вектор и обрабатываю.
мне кажется проблема в или в том что sizeof() не верно указывает размер так как данные в векторе стринг , или
надо прописать цикл считывания по строчно но тогда как быть если в объекте будет например два вектора и map<int<vector<string>>
?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2019, 20:29
Ответы с готовыми решениями:

Запись объекта класса в файл и чтение из файла (Вызвано необработанное исключение: нарушение доступа для чтения)
Доброго времени суток. Вообщем-то есть некий класс Weapons: class Weapons { public: void...

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

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

Для разработанного класса объектов разработать asp-страницы для ввода данных объекта и передачу на сервер
Для разработанного класса объектов(класс был создан раннее). Нужно разработать asp-страницы для...

9
nd2
3415 / 2795 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
13.08.2019, 22:02 2
Цитата Сообщение от royd Посмотреть сообщение
C++
1
vector <string> text;
Классы, с такими полями, не годятся (без сериализации) для бинарных методов записи/чтения.

Добавлено через 6 минут
Запись и чтение структуры с файла
1
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 13
14.08.2019, 06:19  [ТС] 3
Спасибо , пойду читать по библиотеке boost )
0
Мозгоправ
1728 / 1023 / 467
Регистрация: 01.10.2018
Сообщений: 2,136
Записей в блоге: 2
14.08.2019, 15:28 4
Лучший ответ Сообщение было отмечено royd как решение

Решение

Цитата Сообщение от royd Посмотреть сообщение
Спасибо , пойду читать по библиотеке boost )
royd, boost - это само-собой... Но можно обойтись и стандартными средствами.
Схематично это выглядит так:
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
94
95
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
 
using namespace std;
 
struct Data {
    vector<string> v;
    int other_data;
    
    Data() : other_data(42) {
    }
    
    bool write(ostream &os) {
        size_t tmp;
        tmp = v.size();
        os.write((const char *)&tmp, sizeof(size_t));
        for (size_t i = 0; i < v.size(); ++i) {
            tmp = v[i].size();
            os.write((const char *)&tmp, sizeof(size_t));
            os.write(v[i].c_str(), tmp);
        }
        os.write((const char *)&other_data, sizeof(other_data));
        return os.good();
    }
 
    bool read(istream &is) {
        size_t v_size = 0, s_size = 0;
        is.read((char *)&v_size, sizeof(size_t));
        for (size_t i = 0; i < v_size; ++i) {
            is.read((char *)&s_size, sizeof(size_t));
            char *buf;
            buf = new char[s_size + 1];
            is.read(buf, s_size);
            buf[s_size] = '\0';
            v.push_back(buf);
            delete[] buf;
        }
        is.read((char *)&other_data, sizeof(other_data));
        return is.good();
    }
};
 
const char *filename = "test.bin";
 
int main() {
 
    Data data;
 
    data.v.push_back("Hello, world!");
    data.v.push_back("Qwerty");
    data.v.push_back("12345");
 
    ofstream ofs(filename, ios::binary);
    if (ofs) {
        if (data.write(ofs)) {
            cout << "write ok" << endl;
            ofs.close();
        }
        else {
            cout << "write fail" << endl;
            exit(2);
        }
    }
    else {
        cout << "create file error" << endl;
        exit(1);
    }
 
    Data rdata;
 
    ifstream ifs(filename, ios::binary);
    if (ifs) {
        if (rdata.read(ifs)) {
            cout << "read ok" << endl;
            ifs.close();
 
            for (size_t i = 0; i < rdata.v.size(); ++i)
                cout << rdata.v[i] << endl;
            cout << rdata.other_data << endl;
        }
        else {
            cout << "read fail" << endl;
            exit(4);
        }
    }
    else {
        cout << "create file error" << endl;
        exit(3);
    }
 
    system("pause");
    return 0;
}
1
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 13
14.08.2019, 22:07  [ТС] 5
Спасибо огромное за ответ если я правильно понял то идет запись по символьно в файл и подсчет символов в отдельный файл с последующим чтением по символьно, количество символов же уже известно. Сам пришел к такому же выводу что написать можно только так ) не понял что происходит в 12 строчке ?
0
nd2
3415 / 2795 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
14.08.2019, 22:17 6
Цитата Сообщение от royd Посмотреть сообщение
Спасибо огромное за ответ если я правильно понял то идет запись по символьно в файл и подсчет символов в отдельный файл с последующим чтением по символьно, количество символов же уже известно.
Сначала в файл записывается размер вектора (количество строк в нём), потом записываются строки: сначала количество символов в строке, потом сами символы. При чтении всё в обратном порядке делается. Зачем тебе бинарные запись/чтение? Чем текстовые методы не устраивают?
0
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 13
14.08.2019, 22:25  [ТС] 7
устраивают просто мне думается по бинарному файлу навигация легче, а вообще это класс как пример то что я пишу там два поля int два вектора стринг и один map<int<vector<string>> чтобы понять как решить надо упростить вот и я пытаюсь понять как правильно это реализовать .)

Добавлено через 3 минуты
Цитата Сообщение от L0M Посмотреть сообщение
Data() : other_data(42) {
* * }
что означает эта строчка и почему 42?
0
nd2
3415 / 2795 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
14.08.2019, 22:32 8
Цитата Сообщение от royd Посмотреть сообщение
что означает эта строчка и почему 42?
Предположу, что это просто пример: если в классе есть другие данные (POD-типа) и их тоже нужно сохранять в файл.

Добавлено через 1 минуту
А сама строчка: конструктор по умолчанию, со списком инициализации.
0
Мозгоправ
1728 / 1023 / 467
Регистрация: 01.10.2018
Сообщений: 2,136
Записей в блоге: 2
16.08.2019, 17:23 9
royd, nd2 полностью правильно прокомментировал мой пример. А почему 42 - см. здесь.
0
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 13
16.08.2019, 22:46  [ТС] 10
Спасибо за ответ я воспользуюсь идеей , но надо ещё подумать как реализовать перезапись первой строки с информацией о количестве строк и количество объектов , тоесть я же буду их добавлять со временем.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2019, 22:46

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Чтение текстового файла. Парсинг его данных. Создание исключений для данных. Запись свойств объектов в файл
Проблема такая. Есть файл data.txt. В нем например какие-то данные. Landon Donovan, 150, A...

Чтение данных для контролов на форме из ini файла
Подскажите как можно реализовать чтение данных для контролов (в моём случае для кнопок) из ini...

Чтение данных из файла для дальнейших математических преобразований
Здравствуйте. Я только начинаю учить Java, более того еще не дошел до темы, которая будет здесь...

Чтение объекта из файла
Мне нужно записать в файл а потом прочитать из него много объектов одного класса я написал такой...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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