Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
yur@
7 / 7 / 3
Регистрация: 06.03.2014
Сообщений: 106
1

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

05.12.2015, 01:28. Просмотров 816. Ответов 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
Ответы с готовыми решениями:

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

Запись в файл из вектора
ofstream outfile(&quot;ITER.txt&quot;); ostream_iterator&lt;int&gt; Co(outfile,&quot; &quot;); ...

Запись в файл вектора
можете подсказать как записать вектор структур в файл например есть...

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

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

9
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
05.12.2015, 08:13 2
Вектор не может хранить разные классы непосредственно, только если через указатель.
Записывать нужно каждое поле отдельно, учитывая его тип. Записывать класс целиком как структуру некорректно, как недавно выясняли.
0
yur@
7 / 7 / 3
Регистрация: 06.03.2014
Сообщений: 106
05.12.2015, 12:01  [ТС] 3
то есть все таки лучше использовать структуру boost::any?
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
05.12.2015, 12:49 4
Попробуй. Я не пользовался.
0
yur@
7 / 7 / 3
Регистрация: 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
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
05.12.2015, 13:47 6
Ну я же сказал, что через указатель можно, только добавляемые объекты должны быть через new созданы и удалять их надо в конце программы, т. к. вектор это не сделает.
C++
1
fs.write((char*)&tmp, sizeof(tmp));
0
yur@
7 / 7 / 3
Регистрация: 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
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
05.12.2015, 13:52 8
Лучший ответ Сообщение было отмечено yur@ как решение

Решение

Можно короче:
C++
1
vec.push_back(new Square(0.0, 15.0));
1
yur@
7 / 7 / 3
Регистрация: 06.03.2014
Сообщений: 106
05.12.2015, 13:53  [ТС] 9
Спасибо) все решилось) сам протупил))
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
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

Запись в бинарный файл вектора
есть вектор typedef struct Point { double x; double y;...

Запись вектора стуктур в файл
имеется вектор структур struct bb{ string letter; vector&lt;string&gt; word;...

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


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

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

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