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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.82
Sylvos
-25 / 6 / 1
Регистрация: 06.04.2011
Сообщений: 85
#1

Как правильно сохранить и потом считать структуру в бинарный файл - C++

15.05.2011, 04:49. Просмотров 4488. Ответов 10
Метки нет (Все метки)

Есть структура
C++
1
2
3
4
5
6
struct card
{
    int size;
    char *lear;
    int *name;
};
Эта структура это карты игрока.
Заполняем ее данными, у меня это количество масть и значение карты
C++
1
2
3
4
5
6
card CPU={6, new char[CPU.size], new int[CPU.size]};
for(int i=0; i<pack.size; i++)
{
    pack.lear[i]= i;
    pack.lear[i]= rand()%4;
}
Как теперь ее правильно сохранить ?
Я делаю так
C++
1
2
3
4
FILE *fl;
fl= fopen("D:\\qqq.txt", "wb");
fwrite(&CPU, sizeof(card), 1, fl);
fclose(fl);
Но потом после запуска программы в она не записывается
C++
1
2
3
card tmp;
fl=fopen("D:\qqq.txt", "rb");
fread(&tmp, sizeof(card), 1, fl);
Хотя если попытаться сразу ее прочитать не закрывая программу все нормально.
Мне надо сделать сохранение игры. Все данные хранятся у меня в структурах.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2011, 04:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно сохранить и потом считать структуру в бинарный файл (C++):

Не получается прочесть правильно текстовый файл в структуру а затем в бинарный файл - C++
Нужно просто прочесть файл в структуру данных а потом оттуда записать в бинарный файл Вот как выглядит текстовый файл: 11122 Mary...

Сохранить массив в файл а потом считать его из файла - C++
#include &lt;iostream&gt; using namespace std; int main() { setlocale (0,&quot;&quot;); const int str = 10; const int stolb = 10; int...

Как правильно считать (записать) структуру из файла? - C++
не хочет правильно читать, вроде пишет, вроде правильно, не уверен. Заранее благодарен за помощь void __fastcall...

Как открыть бинарный файл, не зная его структуру? - C++
Можно ли как-нибудь открыть бинарный файл, не зная его структуру?

Как сохранить\прочитать контейнер в бинарный файл - C++
ostream_iterator&lt;string, char&gt; out(cout, &quot;\n&quot;); set&lt;string&gt; mat; set&lt;string&gt; pat; string temp; cout &lt;&lt; &quot;Input Mat's...

Как правильно сохранить структуру, унаследованную от структуры, содержащую виртуальный деструктор? - C++
Здравствуйте! Имеется структура: struct Product { int mId; double mCost; int mAmount; Product() {}

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
15.05.2011, 05:34 #2
...А пути-то неправильные...
0
dampir_sanek
150 / 148 / 21
Регистрация: 09.02.2010
Сообщений: 407
15.05.2011, 07:12 #3
C++
1
fl=fopen("D:\\qqq.txt", "rb");
1
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
15.05.2011, 09:00 #4
Вы пишете в файл указатели на память, которые после перезапуска оказываются инвалидными.
1
Sylvos
-25 / 6 / 1
Регистрация: 06.04.2011
Сообщений: 85
15.05.2011, 12:31  [ТС] #5
Цитата Сообщение от Jtalk Посмотреть сообщение
Вы пишете в файл указатели на память, которые после перезапуска оказываются инвалидными.
И как мне это исправить ?
0
dampir_sanek
150 / 148 / 21
Регистрация: 09.02.2010
Сообщений: 407
15.05.2011, 12:42 #6
Sylvos,
C++
1
fwrite(CPU, sizeof(card), 1, fl);
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
15.05.2011, 13:39 #7
dampir_sanek, неправильно, передавать надо адрес переменной. Другое дело, что нет смысла записывать эту переменную в файл.

+++++++++++++++++++++++++++++++++++
Надо так

C++
1
2
3
4
5
6
7
//Запихиваем размер
fwrite(&CPU.size, sizeof(CPU.size), 1, fl);
//Запихиваем массив lear
fwrite(CPU.lear, sizeof(char)*CPU.size, 1, fl);
//Запихиваем массив name
fwrite(CPU.name, sizeof(int)*CPU.size, 1, fl);
fclose(fl);
Только прежде необходимо правильно инициализировать всё это дело, в чём я сильно сомневаюсь!
Я сделал так:
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
52
53
54
55
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
 
struct card
{
        int size;
        char *lear;
        int *name;
};  
 
int main(){
srand (time(0));
 
 
//Заполняем
card CPU;
CPU.size=6;
CPU.lear= new char[CPU.size];
CPU.name= new int[CPU.size];
for(int i=0; i<CPU.size; i++){
        CPU.lear[i]= i;
        CPU.name[i]= rand()%4;
}
 
//ПРоверим, чё у нас получилось:
printf ("CPU.size= %d\n", CPU.size);           
printf ("CPU.lear= %x\n", CPU.lear);           
printf ("CPU.name= %x\n", CPU.name);           
for(int i=0; i<CPU.size; i++){
  printf ("CPU.lear[%d]= %d   ",i, CPU.lear[i]);
  printf ("CPU.name[%d]= %d\n",i,  CPU.name[i]);
}
 
//Перегоним в файл
FILE *fl;
fl= fopen("qqq.txt", "wb");
printf ("sizeof(card)= %d\n",sizeof(card));
 
//Запихиваем размер
fwrite(&CPU.size, sizeof(CPU.size), 1, fl);
//Запихиваем массив lear
fwrite(CPU.lear, sizeof(char)*CPU.size, 1, fl);
//Запихиваем массив lear
fwrite(CPU.name, sizeof(int)*CPU.size, 1, fl);
fclose(fl);
 
delete [] CPU.lear;
delete [] CPU.name;
 
 getchar ();
 return 0;
}
И последнее: тыкая в файл qqq.txt, автор ничё там не увидит. Хотя оно там будет. Но это так, на всякий случай.
1
Sylvos
-25 / 6 / 1
Регистрация: 06.04.2011
Сообщений: 85
15.05.2011, 15:22  [ТС] #8
Записать то понятно но как потом его открыть после повторного открытия программы?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
if(choice==2)// Ото переменная выбора меню 2 это загрузка игры
    {   
        fl= fopen("qqq.txt", "rb");
        fread(&CPU.size, sizeof(CPU.size), 1, fl);
        fread(CPU.lear, sizeof(char)*CPU.size, 1, fl);
        fread(CPU.name, sizeof(int)*CPU.size, 1, fl);
        fclose(fl);
 
 
        cout<<CPU.lear[0]<<CPU.name[0]<<endl;   //Че че опа не**я   
        
        exit(1);
    }
Добавлено через 4 минуты
o_O все понял
C++
1
2
3
4
5
6
7
fl= fopen("qqq.txt", "rb");
        fread(&CPU.size, sizeof(CPU.size), 1, fl);
        CPU.lear=new char[CPU.size];
        CPU.name=new int[CPU.size];
        fread(CPU.lear, sizeof(char)*CPU.size, 1, fl);
        fread(CPU.name, sizeof(int)*CPU.size, 1, fl);
        fclose(fl);
Добавлено через 3 минуты

Не по теме:

ураа наконец тосделал экзаменационую

0
RaTeN
0 / 0 / 0
Регистрация: 14.11.2010
Сообщений: 10
15.05.2011, 15:50 #9
а разве можно бинарно сохранять в txt попробуй bin или dat
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
15.05.2011, 15:59 #10
Можно, расширение нужно для некоторых(!) программ, которые этот файл будут открывать (ну и для пользователей просто чтобы легче было ориентироваться); я имею в первую очередь текстовые редакторы. Не факт, что они будут ориентироваться на расширение но я столкнулся со случаем, когда текстовый редактор, открывая текстовый же файл с определённым расширением, чё-то туда добавлял в конец ОТ СЕБЯ. То ли перевод на другую строку то ли чё-то такое.
В данном случае важен только режим открытия файла.
0
Sylvos
-25 / 6 / 1
Регистрация: 06.04.2011
Сообщений: 85
15.05.2011, 16:01  [ТС] #11
та нету разницы как его сохранять можно вообще без разрешения, я просто хотел сразу всю структуру сохранить, но у меня там были массивы поэтому не получалась, и вчера я сам очень сильно тормозил под вечер всегда голова начинает плохо соображать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2011, 16:01
Привет! Вот еще темы с ответами:

Как сохранить в бинарный файл ресурсы, указатели на которые лежат в векторе? - C++
Здравствуйте! Вот есть такая програмка: #include &lt;iostream&gt; #include &lt;vector&gt; #define FIELD_LENGHT 20 using namespace std; ...

Как сохранить контейнеры STL в файл. И как потом их прочитать из файла - C++
В Qt такой контейнер как map&lt;T,T&gt; библиотеки STL заносится в файл занесением в поток &quot;&lt;&lt;map;&quot; , а как это можно сделать в C++ BUILDER6.0...

Как при помощи ф-ий read/write записать в файл, а потом считать с него - C++
Такой вопрос! Как при помощи ф-ий read/write записать в файл, а потом считать с него различные типы данных, как int,double, char, char. ...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.05.2011, 16:01
Ответ Создать тему
Опции темы

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