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

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

Войти
Регистрация
Восстановить пароль
 
yur@
5 / 5 / 2
Регистрация: 06.03.2014
Сообщений: 106
#1

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

05.12.2015, 01:28. Просмотров 266. Ответов 9

Здравствуйте, уважаемые форумчане. Есть такое задание. 2 класса(Figure, Square). Figure - базовый клас, с виртуальными методами getObjectType(), getObjectSize(). Оба метода переопределены в наследнике. В функции надо произвести запись иерархии классов в файл в бинарном виде и прочитать информацию оттуда-же. Подскажите пожалуйста как это можно реализовать. Я понимаю что работает неправильно, но не знаю как исправить.. может подскажете как сделать, или может лучше делать через boost?
P.S. Сильно не ругайтесь, просто мало работал с указателями, так могу ошибаться где-то)

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
int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<Figure> vec;
    vec.push_back(Square(0.0, 15.0));
    int tmp = vec.size();
    std::ofstream fs("test.txt", std::ios::binary | std::ios::out);
    fs.write((char*)&tmp, sizeof(size_t));
    for (int i = 0; i < vec.size(); i++) {
        int t = vec[i].getObjectType();
        int s = vec[i].getObjectSize();
        fs.write((char*)&t, sizeof(t));
        fs.write((char*)&s, sizeof(s));
        fs.write(reinterpret_cast<char*>(&vec[i]), sizeof(vec[i]));
        fs.close();
    }
    int type, size, vectCnt;
    Square p;
    std::ifstream infs("test.txt", std::ios::binary | std::ios::in);
    
        infs.read((char*)&vectCnt, sizeof(vectCnt));
        infs.read((char*)&type, sizeof(type));
        infs.read((char*)&size, sizeof(size));
        infs.read((char*)&p, sizeof(p));
    
    std::cout << p.getRightTop() << "\n";
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2015, 01:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись в файл вектора обьектов (C++):

Написать функцию для класса, возращающую данный из вектора обьектов класса по итератору вектора - C++
День=добрый как написать функцию для класса возращающую данный из вектора обьектов класса по итератору вектора?? стока запроса: ...

Запись в файл вектора - C++
можете подсказать как записать вектор структур в файл например есть vector&lt;game&gt;gamelist game это структура с полями int data; ...

Запись вектора в файл - C++
Добрый вечер. Есть вектор, содержащий объекты. Мне необходимо записать его в файл, потом считать из него информацию. Как не пытался, все не...

Запись в файл из вектора - C++
ofstream outfile(&quot;ITER.txt&quot;); ostream_iterator&lt;int&gt; Co(outfile,&quot; &quot;); copy(v1.begin(),v1.end(),Co); Есть вектор заполненый...

Запись вектора стуктур в файл - C++
имеется вектор структур struct bb{ string letter; vector&lt;string&gt; word; }; vector&lt;bb&gt; base; как записать её в файл, чтобы...

Запись в бинарный файл вектора - C++
есть вектор typedef struct Point { double x; double y; Point(double x_, double y_) : x(x_), y(y_) {} ...

9
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,670
05.12.2015, 08:13 #2
Вектор не может хранить разные классы непосредственно, только если через указатель.
Записывать нужно каждое поле отдельно, учитывая его тип. Записывать класс целиком как структуру некорректно, как недавно выясняли.
0
yur@
5 / 5 / 2
Регистрация: 06.03.2014
Сообщений: 106
05.12.2015, 12:01  [ТС] #3
то есть все таки лучше использовать структуру boost::any?
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,670
05.12.2015, 12:49 #4
Попробуй. Я не пользовался.
0
yur@
5 / 5 / 2
Регистрация: 06.03.2014
Сообщений: 106
05.12.2015, 13:39  [ТС] #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
std::vector<Figure*> vec;
    Square s(0.0, 15.0);
    vec.push_back(&s);
    int tmp = vec.size();
    std::ofstream fs("test.txt", std::ios::binary | std::ios::out);
    fs.write((char*)&tmp, sizeof(size_t));
    for (int i = 0; i < vec.size(); i++) {
        int t = vec[i]->getObjectType();
        int s = vec[i]->getObjectSize();
        fs.write((char*)&t, sizeof(t));
        fs.write((char*)&s, sizeof(s));
        fs.write(reinterpret_cast<char*>(&vec[i]), sizeof(vec[i]));
        fs.close();
    }
    int type, size, vectCnt;
    Square p;
    std::ifstream infs("test.txt", std::ios::binary | std::ios::in);
    
        infs.read((char*)&vectCnt, sizeof(vectCnt));
        infs.read((char*)&type, sizeof(type));
        infs.read((char*)&size, sizeof(size));
        infs.read((char*)&p, sizeof(p));
    
    std::cout << p.getObjectSize() << "\n";
    return 0;
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,670
05.12.2015, 13:47 #6
Ну я же сказал, что через указатель можно, только добавляемые объекты должны быть через new созданы и удалять их надо в конце программы, т. к. вектор это не сделает.
C++
1
fs.write((char*)&tmp, sizeof(tmp));
0
yur@
5 / 5 / 2
Регистрация: 06.03.2014
Сообщений: 106
05.12.2015, 13:49  [ТС] #7
Вы имеете ввиду при добавлении в вектор?
C++
1
2
Square *s = new Square(0.0, 15.0);
    vec.push_back(s);
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,670
05.12.2015, 13:52 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Можно короче:
C++
1
vec.push_back(new Square(0.0, 15.0));
1
yur@
5 / 5 / 2
Регистрация: 06.03.2014
Сообщений: 106
05.12.2015, 13:53  [ТС] #9
Спасибо) все решилось) сам протупил))
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,670
05.12.2015, 14:14 #10
Ты про удаление не забудь.
1
05.12.2015, 14:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2015, 14:14
Привет! Вот еще темы с ответами:

Запись вектора в бинарный файл. - C++
Ребят помогите кто сделать запись в бинарный файл ,а не в текстовый(как в данном коде ) , а то не выходит как то ! заранее спасибо ! ...

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

Запись вектора в бинарный файл - C++
Здравствуйте, не получаеться написать нормальную запись в файл вектора из обьектов класа. Вот сам клас: public class Human { ...

Запись вектора строк в бинарный файл - C++
Помогите пожалуйста. Компилируется отлично, без ошибок и варнингов, но при запуске выдает ошибку. уже не знаю как быть. не понятно какая...


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

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

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