Форум программистов, компьютерный форум CyberForum.ru

запись vector в бинарном виде - C++

Восстановить пароль Регистрация
 
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 12:15     запись vector в бинарном виде #1
есть что-то типа
C++
1
2
3
4
5
6
7
8
9
10
struct X
{
vector<Game*> v;
};
int main()
{
      X x;
      FILE* f=fopen(...
      fwrite(&x,sizeof(X),1,f);
}
когда потом читаю fread-ом, в v мусор, каким образом можно заменить этот мусор(присвоить v другой вектор не получилось т.к. видимо внутри происходит перезапись и т.д.),каким образом решить эту проблему(т.е. в вектор содержит кривой адрес, как это исправить)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
17.10.2011, 13:14     запись vector в бинарном виде #2
eXXXXXXXXXXX, в файле нельзя хранить указатель, только значение. Вектор тоже нельзя хранить.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.10.2011, 13:15     запись vector в бинарном виде #3
use boost::serialization.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.10.2011, 13:33     запись vector в бинарном виде #4
ForEveR, но если Game - POD, можно и свой костыль навернуть
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 14:01  [ТС]     запись vector в бинарном виде #5
Цитата Сообщение от gooseim Посмотреть сообщение
eXXXXXXXXXXX, в файле нельзя хранить указатель, только значение. Вектор тоже нельзя хранить.
я потом считываю кривой указатель с неизвестным содержимым. Мне нужно подменить считанное значение другим. Это все только для того, чтобы писать fwrite для всей структуры, потом я еще запишу содержимое вектора, но после fread-а я получаю в векторе что-то непонятное, мне нужно заменить это на то, что записано после структуры.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.10.2011, 14:04     запись vector в бинарном виде #6
Цитата Сообщение от eXXXXXXXXXXX Посмотреть сообщение
я потом считываю кривой указатель с неизвестным содержимым. Мне нужно подменить считанное значение другим. Это все только для того, чтобы писать fwrite для всей структуры, потом я еще запишу содержимое вектора, но после fread-а я получаю в векторе что-то непонятное, мне нужно заменить это на то, что записано после структуры.
Ничего непонятно.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
17.10.2011, 14:28     запись vector в бинарном виде #7
В общем вам надо поэлементно сохранять все простые данные и потом поэлементно их считывать. Читать и писать сложные типы данных, такие как вектор, и указатели нельзя.

Добавлено через 1 минуту
eXXXXXXXXXXX, покажите ваш класс Game
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 15:49  [ТС]     запись vector в бинарном виде #8
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
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct X
{
    int a;
    int b;
    int c;
    vector<int> v;
    int d;
    int e;
};
void Write(X x)
{
    fstream out("X",ios_base::binary|ios_base::out);
    out.write((const char*)&x,sizeof(X));
    int len=x.v.size();
    out.write((const char*)&len,sizeof(int));
    for (int i=0;i<len;i++)
    {
        int tmp=x.v[i];
        out.write((const char*)&tmp,sizeof(int));
    }
    out.close();
}
X Read()
{
    fstream in("X",ios_base::binary|ios_base::in);
    X* x=new X();
    in.read((char*)x,sizeof(X));
    x->v.clear();
    int len;
    in.read((char*)&len,sizeof(int));
    for (int i=0;i<len;i++)
    {
        int tmp;
        in.read((char*)&tmp,sizeof(int));
        x->v.push_back(tmp);
    }
    in.close();
    return *x;
}
int main()
{
    X x;
    x.v.push_back(242);
    Write(x);
    //X y=Read(); //читаю после перезапуска, когда адреса другие
    return 0;
}
C++
1
x->v.push_back(tmp);//здесь ошибка т.к. внутри вектора адреса кривые
вектор очистить я тоже не могу, что делать?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.10.2011, 16:18     запись vector в бинарном виде #9
Цитата Сообщение от eXXXXXXXXXXX Посмотреть сообщение
вектор очистить я тоже не могу, что делать?
Это же очевидно! Не надо сохранять указатели!
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
17.10.2011, 16:42     запись vector в бинарном виде #10
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
struct X
{
        int a;
        int b;
        int c;
        vector<int> v;
        int d;
        int e;
    X() {}
    X(const X& x): a(x.a), b(x.b), c(x.c), d(x.e), v(x.v) {} 
};
void Write(X x)
{
        fstream out("X",ios_base::binary|ios_base::out);
        out.write((const char*)&x.a,sizeof(int));
    out.write((const char*)&x.b,sizeof(int));
    out.write((const char*)&x.c,sizeof(int));
        int len=x.v.size();
        out.write((const char*)&len,sizeof(int));
        for (int i=0;i<len;i++)
        {
                out.write((const char*)&x.v[i],sizeof(int));
        }
    out.write((const char*)&x.d,sizeof(int));
    out.write((const char*)&x.e,sizeof(int));
        out.close();
}
X Read()
{
        fstream in("X",ios_base::binary|ios_base::in);
        X x;
        in.read((char*)&x.a,sizeof(int));
    in.read((char*)&x.b,sizeof(int));
    in.read((char*)&x.c,sizeof(int));
        int len;
        in.read((char*)&len,sizeof(int));
        for (int i=0;i<len;i++)
        {
                int tmp;
                in.read((char*)&tmp,sizeof(int));
                x.v.push_back(tmp);
        }
    in.read((char*)&x.d,sizeof(int));
    in.read((char*)&x.e,sizeof(int));
        in.close();
        return x;
}
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 16:49  [ТС]     запись vector в бинарном виде #11
Цитата Сообщение от fasked Посмотреть сообщение
Это же очевидно! Не надо сохранять указатели!
да понятно, что не надо, меня конкретно интересует, могу ли я потом с этим кривым вектором сделать что-то

gooseim, это понятно, что так можно, а если я целиком структуру записал, а потом прочитал, тогда что-нибудь можно сделать, чтобы выделить заново под вектор память
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
17.10.2011, 16:58     запись vector в бинарном виде #12
eXXXXXXXXXXX, вот так можно:
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
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct X
{
        int a;
        int b;
        int c;
        vector<int> v;
        int d;
        int e;
};
void Write(X* x)
{
        fstream out("X",ios_base::binary|ios_base::out);
        out.write((const char*)x,sizeof(X));
}
X Read()
{
        fstream in("X",ios_base::binary|ios_base::in);
        X* x=new X();
        in.read((char*)x,sizeof(X));
        return *x;
}
 
int main()
{
        X x;
        x.v.push_back(242);
        Write(&x);
        X y=Read(); 
        return 0;
}
Только вопрос: зачем?
При такой записи у вас будут две битовые копии, которые естественно между собой дружить не будут. Надо делать именно как до этого писал.
Причем если программу закрыть и потом открыть то при чтении из файла будет креш.
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 18:08  [ТС]     запись vector в бинарном виде #13
Цитата Сообщение от gooseim Посмотреть сообщение
Причем если программу закрыть и потом открыть то при чтении из файла будет креш.
т.е. когда я открою программу то получу битый вектор, с которым в принципе ничего не смогу сделать(мне просто интересно можно ли этому вектору присвоить другой вектор без падений программы)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2011, 20:16     запись vector в бинарном виде
Еще ссылки по теме:

C++ Запись в vector<vector<char>>
При чтении dll библиотеки в обычном(не бинарном) виде, чтение прерывается на NULL C++
C++ Запись в файл в бинарном режиме

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

Или воспользуйтесь поиском по форуму:
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
17.10.2011, 20:16     запись vector в бинарном виде #14
Я теперь уже тоже не понимаю, что вам нужно...
Yandex
Объявления
17.10.2011, 20:16     запись vector в бинарном виде
Ответ Создать тему
Опции темы

Текущее время: 19:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru