Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 4
1

Чтение/Запись вектора указателей из/в файл

13.03.2014, 20:42. Показов 2555. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Не судите строго - опыта мало. Вообщем, нужна помощь, уже в конец запутался. Весь проект, естественно тащить не буду, попытаюсь на примере.
Допустим, имею:
1) Класс Cube c разнородной информацией и де-/сериализатором для потока.
Кликните здесь для просмотра всего текста
C++ (Qt)
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
class Cube
{
public:
 
    bool a;
    int  b;
    char c;
    
    friend QDataStream &operator<< (QDataStream &write, const Cube *cb);
    friend QDataStream &operator>> (QDataStream &read, Cube *cb);
};
 
QDataStream &operator<< (QDataStream &write, const Cube *cb)  //Сериализация
{
    write << cb->a;
    write << cb->b;
    write << cb->c;
    return write;
}
 
QDataStream &operator>> (QDataStream &read, Cube *cb)  //Десериализация
{
    read >> cb->a;
    read >> cb->b;
    read >> cb->c;
    return read;
}

2) Класс Data с объявленным вектором указателей на объекты Cube и методами записи/чтения в данных из/в файл
Кликните здесь для просмотра всего текста

C++ (Qt)
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
class Data
{
public:
 
    QVector<Cube*>  *Data_Cubes; //Данные по кубам
 
    void save(QVector<Cube*>  *Cubes);//Запись в файл
    void load(QVector<Cube*>  *Cubes);//Чтение из файла
};
 
void Data::save(QVector<Abonent *> &Cubes)
{
    QFile File("Cube.dat");
    if(File.open(QIODevice::WriteOnly))
    {
        QDataStream write(&File);
        write << Cubes;  //В стандартной библиотеке сериализатор для QVector описан
    }
    //Проверки различные и выводы сообщений, касаемые файла и потока опустим
}
 
void Data::load(QVector<Abonent *> &Cubes)
{
    QFile File("Cube.dat");
    if(File.open(QIODevice::ReadOnly))
    {
        QDataStream read(&File);
        read >> Cubes;  //В стандартной библиотеке десериализатор для QVector описан
    }
    //Проверки различные и выводы сообщений, касаемые файла и потока опустим
}

3)В QDaraStream предусмотрены де-/сериализатор для QVector:
Кликните здесь для просмотра всего текста

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template<typename T>
QDataStream& operator<<(QDataStream& s, const QVector<T>& v)
{
    s << quint32(v.size());
    for (typename QVector<T>::const_iterator it = v.begin(); it != v.end(); ++it)
        s << *it;
    return s;
}
 
template<typename T>
QDataStream& operator>>(QDataStream& s, QVector<T>& v)
{
    v.clear();
    quint32 c;
    s >> c;
    v.resize(c);
    for(quint32 i = 0; i < c; ++i) {
        T t;
        s >> t;
        v[i] = t;
    }
    return s;
}

4)Основное окно, с общей информацией, откуда вызываю запись и чтение данных
Кликните здесь для просмотра всего текста

C++ (Qt)
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
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
    
    Data    *Data_common;//Общие данные
};
 
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    Data_common = new Data;
    Data_common->load(*Data_common->Data_Cubes);//Чтение
}
 
MainWindow::~MainWindow()
{
    delete ui;
    Data_common->save(*Data_common->Data_Cubes);//Запись
    /// Есть ли необходимость в удалении указателя? (обнуление для избежания проблем)
    delete Data_common;
    Data_common=0;
}


При текущем варианте, данные пишутся и читаются в десериализаторе Cube, но сам вектор забивается последним объектом и программа вылетает. Я уже вконец запустался с указателями и объектами.
Вопрос: подскажите, что делаю не так?

Добавлено через 1 час 45 минут
На другом форуме предложили вариант использовать не указатель на вектор, а сам объект вектора указателей.
Вообщем, попробовал вариант с объектом (QVector<Cube*> Data_Cubes) - ничего не изменилось
Сразу скажу, мне нужен именно Вектор Указателей на объекты Cube.

К сожалению, ошибку допустил в описании проблемы, а именно, класса Cube(для де-/сериализации подкладываю не объект Cube а указатель на него, того требует описанная де-/сериализация в QDatastream). Уже поправил.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2014, 20:42
Ответы с готовыми решениями:

Запись вектора в файл
Здравствуйте в одной функции записываю вектор Объявил QVector&lt;souble&gt; vec; Записываю в вектор:...

Запись в файл и чтение из файла указателей
Всем доброго времени суток! У меня возникла проблема с чтением из файла. Я создаю объект...

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

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

3
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.03.2014, 10:39 2
Что за QVector<Abonent *>?
0
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 4
14.03.2014, 17:44  [ТС] 3
Косяк, копировал из проекта - переименовать забыл это QVector<Cube *>.
Кнопки редактировать не вижу, видимо мало сообщений на форуме.
На другом ресурсе вроде бы дали ответ на мой вопрос:
сериализация не работает с указателями. хранить указатели в файле - это безумие. сериализация работает только с объектами. поэтому сериализовать/десериализовать нужно сами объекты, а массив указателей создавать параллельно этому процессу, добавляя указатели на десериализованные объекты по мере их создания.
Реализую - отпишусь
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.03.2014, 20:15 4
Цитата Сообщение от Not_Once Посмотреть сообщение
Косяк, копировал из проекта - переименовать забыл это QVector<Cube *>.
В прототипе функций параметр - указатель на вектор, в реализации - ссылка. Тоже косяк?
0
14.03.2014, 20:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2014, 20:15
Помогаю со студенческими работами здесь

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

Запись вектора uin8_t в бинарный файл и обратное чтение из файла
Здравствуйте. Есть std::vector&lt;uint8_t&gt;. Нужно записать все элементы в бинарный файл, а затем...

Запись вектора строк в массив указателей на тип char
Решаю задачу 4.34 из книги Липпмана С. Язык программирования С++. Вводный курс. 4-е изд. Задание:...

Сохранение в файл вектора указателей
Здравствуйте. Помогите, пожалуйста, советами - как правильно сохранить на диск четыре вектора...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru