32 / 32 / 6
Регистрация: 24.02.2011
Сообщений: 126
1

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

17.10.2011, 12:15. Показов 1275. Ответов 13
Метки нет (Все метки)

есть что-то типа
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 другой вектор не получилось т.к. видимо внутри происходит перезапись и т.д.),каким образом решить эту проблему(т.е. в вектор содержит кривой адрес, как это исправить)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2011, 12:15
Ответы с готовыми решениями:

Запись в vector<vector<char>>
Задача такова: Считать с нескольких разных файлов бинарным способом в vector&lt;vector&lt;char&gt;&gt; _data....

Нюансы синтаксиса: что означает запись vector<int*> a и vector <int>*a ?
Часто встречается вот такая запись: vector&lt;int&gt; a; это понятно что. Массив объектов int А вот...

Результат в бинарном виде
каким образом в C можно перезаписать результат программы в бинарном или в же в другом виде?

Открытия exeшника в бинарном виде
void main(void) { FILE * f = NULL; if(fopen(&quot;..\\debug\\ffffffff.exe&quot;, &quot;r&quot;) == NULL) ...

13
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
17.10.2011, 13:14 2
eXXXXXXXXXXX, в файле нельзя хранить указатель, только значение. Вектор тоже нельзя хранить.
0
В астрале
Эксперт С++
8048 / 4805 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.10.2011, 13:15 3
use boost::serialization.
1
Эксперт С++
5038 / 2617 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
17.10.2011, 13:33 4
ForEveR, но если Game - POD, можно и свой костыль навернуть
0
32 / 32 / 6
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 14:01  [ТС] 5
Цитата Сообщение от gooseim Посмотреть сообщение
eXXXXXXXXXXX, в файле нельзя хранить указатель, только значение. Вектор тоже нельзя хранить.
я потом считываю кривой указатель с неизвестным содержимым. Мне нужно подменить считанное значение другим. Это все только для того, чтобы писать fwrite для всей структуры, потом я еще запишу содержимое вектора, но после fread-а я получаю в векторе что-то непонятное, мне нужно заменить это на то, что записано после структуры.
0
Эксперт С++
5038 / 2617 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
17.10.2011, 14:04 6
Цитата Сообщение от eXXXXXXXXXXX Посмотреть сообщение
я потом считываю кривой указатель с неизвестным содержимым. Мне нужно подменить считанное значение другим. Это все только для того, чтобы писать fwrite для всей структуры, потом я еще запишу содержимое вектора, но после fread-а я получаю в векторе что-то непонятное, мне нужно заменить это на то, что записано после структуры.
Ничего непонятно.
0
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
17.10.2011, 14:28 7
В общем вам надо поэлементно сохранять все простые данные и потом поэлементно их считывать. Читать и писать сложные типы данных, такие как вектор, и указатели нельзя.

Добавлено через 1 минуту
eXXXXXXXXXXX, покажите ваш класс Game
0
32 / 32 / 6
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 15:49  [ТС] 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);//здесь ошибка т.к. внутри вектора адреса кривые
вектор очистить я тоже не могу, что делать?
0
Эксперт С++
5038 / 2617 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
17.10.2011, 16:18 9
Цитата Сообщение от eXXXXXXXXXXX Посмотреть сообщение
вектор очистить я тоже не могу, что делать?
Это же очевидно! Не надо сохранять указатели!
0
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
17.10.2011, 16:42 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;
}
0
32 / 32 / 6
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 16:49  [ТС] 11
Цитата Сообщение от fasked Посмотреть сообщение
Это же очевидно! Не надо сохранять указатели!
да понятно, что не надо, меня конкретно интересует, могу ли я потом с этим кривым вектором сделать что-то

gooseim, это понятно, что так можно, а если я целиком структуру записал, а потом прочитал, тогда что-нибудь можно сделать, чтобы выделить заново под вектор память
0
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
17.10.2011, 16:58 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;
}
Только вопрос: зачем?
При такой записи у вас будут две битовые копии, которые естественно между собой дружить не будут. Надо делать именно как до этого писал.
Причем если программу закрыть и потом открыть то при чтении из файла будет креш.
0
32 / 32 / 6
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 18:08  [ТС] 13
Цитата Сообщение от gooseim Посмотреть сообщение
Причем если программу закрыть и потом открыть то при чтении из файла будет креш.
т.е. когда я открою программу то получу битый вектор, с которым в принципе ничего не смогу сделать(мне просто интересно можно ли этому вектору присвоить другой вектор без падений программы)
0
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
17.10.2011, 20:16 14
Я теперь уже тоже не понимаю, что вам нужно...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2011, 20:16
Помогаю со студенческими работами здесь

Открыть файл в бинарном виде
нужно считать данные из файла в бинарном виде. нельзя использовать библиотеку &lt;fstream&gt;, как это...

Объявление числа в бинарном виде
Подскажите, пожалуйста! Нужно объявить что-то типо маски в бинарном виде. Но не знаю как это...

представление растрового изображения в бинарном виде
Добрый день имеется растровое изображение(jpg,png..etc), как средствами Qt преобразовать...

Чтение файла в бинарном виде ЧАСТЯМИ
Собственно вопрос в самом названии темы. Возможно ли читать файл функцией Open sFile For Binary As...


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

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

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