3 / 3 / 5
Регистрация: 31.03.2015
Сообщений: 23
1

Чтение информации для вектора структур, из бинарного файла

25.06.2018, 21:45. Показов 703. Ответов 1
Метки нет (Все метки)

Добрый день, есть у меня класс, что-то вроде электронного реестра, данные хранятся в виде структуры, а те, в свою очередь, помещены в вектор. При закрытии программы, данные должны записываться в файл, с этим все гладко. Но, при чтении, возникала проблема, никак не могу разобраться с тем, как это осуществить, см. функцию read_data_from_file(). Буду благодарен помощи.

RegisterList.h
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
#pragma once
 
#include <string>
#include <vector>
#include <fstream>
 
class RegisterList
{
public:
    RegisterList() : data_list(0), _size(data_list.size())
    {
    }
 
    ~RegisterList()
    {
        if (!this->is_empty())
        {
            std::ofstream os("data.dat", std::ios::binary);
 
            int size1 = data_list.size();
            os.write((const char*)&size1, sizeof(size1));
            os.write((const char*)&data_list[0], size1 * sizeof(RegisterList::Data));
            os.close();
        }
 
        this->clear();
    }
 
    struct Data
    {
        Data() :    _series(""),
                    _type(""),
                    _name(""),
                    _register_date(""),
                    _dev_info(""),
                    _from("")
        {}
 
        Data(std::string series, std::string type,
            std::string name, std::string register_date, 
            std::string dev_info, std::string from) :   _series(series), 
                                                        _type(type), 
                                                        _name(name), 
                                                        _register_date(register_date), 
                                                        _dev_info(dev_info),
                                                        _from(from)
        {}
 
        std::string _series;
        std::string _type;
        std::string _name;
        std::string _register_date;
        std::string _dev_info;
        std::string _from;
    };
 
    std::size_t size();
 
    bool is_empty();
    bool file_is_empty();
 
    const std::vector<RegisterList::Data> &_data_list() const;
    void search_by_series(const std::string& series);
    void search_by_name(const std::string& name);
    void print();
    void print(const Data& data);
    void remove(const std::string& series);
    void close();
    void clear();
    void add(const Data& data);
    void add();
 
    void read_data_from_file();
 
private:
    std::vector<Data> data_list;
    std::size_t _size;
};


RegisterList.cpp
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#include "src\RegisterList.h"
 
#include <iostream>
#include <algorithm>
#include <exception>
#include <cmath>
 
std::size_t RegisterList::size()
{
    return _size;
}
 
const std::vector<RegisterList::Data> &RegisterList::_data_list() const 
{
    return data_list;
}
 
bool RegisterList::is_empty()
{
    return _size == 0 ? true : false;
}
 
bool RegisterList::file_is_empty()
{
    std::fstream is;
    is.open("data.dat", std::ios::in);
 
    long file_size;
    is.seekg(0, std::ios::end);
    file_size = is.tellg();
 
    if (file_size == 0)
    {
        is.close();
        return 0;
    }
 
    is.close();
    return 1;
}
 
void RegisterList::search_by_series(const std::string& series)
{
    try
    {
        if (is_empty())
            throw std::out_of_range("Error: List is empty");
 
        bool found = 0;
        for (const auto &i : data_list)
        {
            if (i._series == series)
            {
                print(i);
                found++;
            }
        }
 
        if (found < 1)
            throw std::out_of_range("Error: Series is incorrect");
    }
    catch (std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }
}
 
void RegisterList::search_by_name(const std::string& name)
{
    try
    {
        if (is_empty())
            throw std::out_of_range("Error: List is empty");
 
        bool found = 0;
        for (const auto &i : data_list)
        {
            if (i._name == name)
            {
                print(i);
                found++;
            }
        }
 
        if (found < 1)
            throw std::out_of_range("Error: Name is incorrect");
    }
    catch (std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }
}
 
void RegisterList::print()
{
    try
    {
        if (is_empty())
            throw std::out_of_range("Error: List is empty");
 
        for (const auto &i : data_list)
        {
            print(i);
        }
    }
    catch (std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }
}
 
void RegisterList::print(const Data& data)
{
    try
    {
        if (is_empty())
            throw std::out_of_range("Error: List is empty");
 
        std::cout << "Dev info: " << data._dev_info << std::endl;
        std::cout << "From: "  << data._from << std::endl;
        std::cout << "Name: " << data._name << std::endl;
        std::cout << "Register date: " << data._register_date << std::endl;
        std::cout << "Series: " << data._series << std::endl;
        std::cout << "Type: " << data._type << std::endl;
        std::cout << std::endl;
    }
    catch (std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }
}
 
void RegisterList::remove(const std::string& series)
{
    try
    {
        if (data_list.empty())
            throw std::out_of_range("Error: Out of range");
 
        data_list.erase(
            std::remove_if(data_list.begin(), data_list.end(), [&](Data const & data) {
            return data._series == series;
        }), data_list.end());
        _size--;
    }
    catch (std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }
}
 
void RegisterList::close()
{
    this->clear();
}
 
void RegisterList::add(const Data& data)
{
    data_list.push_back(data);
    _size++;
}
 
void RegisterList::add()
{
    Data data;
 
    std::cout << "\nDev info: ";
    getline(std::cin, data._dev_info);
    
    std::cout << "From: ";
    getline(std::cin, data._from);
 
    std::cout << "Name: ";
    getline(std::cin, data._name);
 
    std::cout << "Register date: ";
    getline(std::cin, data._register_date);
 
    std::cout << "Series: ";
    getline(std::cin, data._series);
 
    std::cout << "Type: ";
    getline(std::cin, data._type);
 
    data_list.push_back(data);
    _size++;
}
 
void RegisterList::clear()
{
    try
    {
        if (_size == 0)
            throw std::out_of_range("Error: List is empty!");
        else
        {
            data_list.clear();
            _size = 0;
        }
    }
    catch (std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }
}
 
void RegisterList::read_data_from_file()
{
    if (!(this->file_is_empty()))
    {
        std::vector<Data> buff;
 
        std::ifstream is("data.dat", std::ios::binary);
        int size;
        is.read((char*)&size, sizeof(size));
        buff.resize(size);
 
        is.read((char*)&buff[0], size * sizeof(Data));
 
        for (const auto & i : buff)
        {
            this->add(i);
            _size++;
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2018, 21:45
Ответы с готовыми решениями:

Чтение вектора структур из бинарного файла
Есть функция записи и чтения: void fout(vector&lt;struc&gt;&amp;arr, string path) { int a, b; ...

Чтение массива структур из бинарного файла
Доброго времени суток.Возникла проблема с чтением структур из бинарного файла.Файл открывает,но при...

Чтение массива структур из бинарного файла
при выводе дает какую-то кашу из символов переписываю структуру из одного файла в 10. это...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении,...

1
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
25.06.2018, 23:15 2
Каждый объект string записывается индивидуально - длина+содержимое. А считывается в какой-то буфер, и затем уже переносится в string.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2018, 23:15
Помогаю со студенческими работами здесь

Чтение вектора структур из файла
struct TRANSACTIONS { unsigned long long sender; unsigned long long receiver; unsigned long...

Чтение структурированной информации из бинарного файла
Как правильно написать на C# код для считывания информации из следующего файла? Header Block...

Чтение из бинарного файла и запись в него вектора чисел
Всем доброго времени суток форумчане!:) Есть код который читает из двух файлов два вектора...

Переписать код с C# - чтение информации из бинарного файла
Есть код приведенный на одном из стороннем форуме, который читает данные из бинарного файла. Как...

Запись и чтение вектора структур в бинарный файл
Есть заполненный вектор структур. Структура вида: struct struc { string a; int x; map&lt;int,...

Запись и чтение вектора структур в бинарный файл(2)
Есть заполненный вектор структур. Структура вида: struct struc { string a; int x; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru