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

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

Войти
Регистрация
Восстановить пароль
 
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
#1

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

17.10.2011, 12:15. Просмотров 1052. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2011, 12:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос запись vector в бинарном виде (C++):

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

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

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

Сконвертировать текстовые данные из одного файла в другой в бинарном виде - C++
В принципе, заголовок говорит сам за себя. Нужно считать текст из одного файла и представить его в другом файле в бинарном виде. Буду...

Удалить запись в бинарном файле - C++
Доброго временни суток, пишу функции записи/чтения. В приложении есть массив очень сложных объектов класса с множеством структур и векторов...

Запись char в бинарном режиме - C++
Пишу в файл две структуры. struct ApRegFileHead { char *rHead; unsigned int version; unsigned int rezerv; }; и

13
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
17.10.2011, 13:14 #2
eXXXXXXXXXXX, в файле нельзя хранить указатель, только значение. Вектор тоже нельзя хранить.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
17.10.2011, 13:15 #3
use boost::serialization.
1
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.10.2011, 13:33 #4
ForEveR, но если Game - POD, можно и свой костыль навернуть
0
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 14:01  [ТС] #5
Цитата Сообщение от gooseim Посмотреть сообщение
eXXXXXXXXXXX, в файле нельзя хранить указатель, только значение. Вектор тоже нельзя хранить.
я потом считываю кривой указатель с неизвестным содержимым. Мне нужно подменить считанное значение другим. Это все только для того, чтобы писать fwrite для всей структуры, потом я еще запишу содержимое вектора, но после fread-а я получаю в векторе что-то непонятное, мне нужно заменить это на то, что записано после структуры.
0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.10.2011, 14:04 #6
Цитата Сообщение от eXXXXXXXXXXX Посмотреть сообщение
я потом считываю кривой указатель с неизвестным содержимым. Мне нужно подменить считанное значение другим. Это все только для того, чтобы писать fwrite для всей структуры, потом я еще запишу содержимое вектора, но после fread-а я получаю в векторе что-то непонятное, мне нужно заменить это на то, что записано после структуры.
Ничего непонятно.
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
17.10.2011, 14:28 #7
В общем вам надо поэлементно сохранять все простые данные и потом поэлементно их считывать. Читать и писать сложные типы данных, такие как вектор, и указатели нельзя.

Добавлено через 1 минуту
eXXXXXXXXXXX, покажите ваш класс Game
0
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 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
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.10.2011, 16:18 #9
Цитата Сообщение от eXXXXXXXXXXX Посмотреть сообщение
вектор очистить я тоже не могу, что делать?
Это же очевидно! Не надо сохранять указатели!
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
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
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 16:49  [ТС] #11
Цитата Сообщение от fasked Посмотреть сообщение
Это же очевидно! Не надо сохранять указатели!
да понятно, что не надо, меня конкретно интересует, могу ли я потом с этим кривым вектором сделать что-то

gooseim, это понятно, что так можно, а если я целиком структуру записал, а потом прочитал, тогда что-нибудь можно сделать, чтобы выделить заново под вектор память
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
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
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
17.10.2011, 18:08  [ТС] #13
Цитата Сообщение от gooseim Посмотреть сообщение
Причем если программу закрыть и потом открыть то при чтении из файла будет креш.
т.е. когда я открою программу то получу битый вектор, с которым в принципе ничего не смогу сделать(мне просто интересно можно ли этому вектору присвоить другой вектор без падений программы)
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
17.10.2011, 20:16 #14
Я теперь уже тоже не понимаю, что вам нужно...
0
17.10.2011, 20:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2011, 20:16
Привет! Вот еще темы с ответами:

Запись в файл в бинарном режиме - C++
Есть файл, 1.exe, как его открыть чтоб можно было записать в него свой hex код ?

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

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

Как в бинарном файле (.dat) удалять и редактировать выбранную запись - C++
Подскажите как в бинарном файле(.dat) удалять и редактировать выбранную запись(case 5 и case 6): #include &quot;stdafx.h&quot; #include...


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

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

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