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

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

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

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

17.10.2011, 12:15. Просмотров 1036. Ответов 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 другой вектор не получилось т.к. видимо внутри происходит перезапись и т.д.),каким образом решить эту проблему(т.е. в вектор содержит кривой адрес, как это исправить)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2011, 12:15     запись vector в бинарном виде
Посмотрите здесь:

Открытия 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;; ...

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
17.10.2011, 13:14     запись vector в бинарном виде #2
eXXXXXXXXXXX, в файле нельзя хранить указатель, только значение. Вектор тоже нельзя хранить.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
17.10.2011, 13:15     запись vector в бинарном виде #3
use boost::serialization.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.10.2011, 14:04     запись vector в бинарном виде #6
Цитата Сообщение от eXXXXXXXXXXX Посмотреть сообщение
я потом считываю кривой указатель с неизвестным содержимым. Мне нужно подменить считанное значение другим. Это все только для того, чтобы писать fwrite для всей структуры, потом я еще запишу содержимое вектора, но после fread-а я получаю в векторе что-то непонятное, мне нужно заменить это на то, что записано после структуры.
Ничего непонятно.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
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
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.10.2011, 16:18     запись vector в бинарном виде #9
Цитата Сообщение от eXXXXXXXXXXX Посмотреть сообщение
вектор очистить я тоже не могу, что делать?
Это же очевидно! Не надо сохранять указатели!
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
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
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
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 в бинарном виде
Еще ссылки по теме:

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

Вывод на экран содержиоме vector в виде двумерного массива - C++
Создал функцию в которой vector инициализируется значениями передаваемого двумерного массива: void ProcessDoubleArray(double *arr,int...

Запись в vector с последующим чтением - C++
Добрый день! Хочу реализовать программу, которая записывает в vector элементы последовательности Фибоначчи, а потом считывает их. Мой...

Запись/считывание vector в/из файл - C++
Здравствуйте. Есть массив векторов. Необходимо их в бинарном виде записать, а потом считать из файла без сторонних библиотек. Использую...


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

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

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