Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
5 / 5 / 0
Регистрация: 04.01.2012
Сообщений: 41
1

Вылет при записи структуры в файл [C++]

04.01.2012, 02:59. Показов 1133. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здраствуйте!
Я совсем недавно начал изучать C++. конечно же, написал калькулятор, и теперь решил написать небольшую игру-рогалик с псевдослучайной генерацией мира.
Проблема в чём - всё компилируется отлично, но при выполнении записи x[i].mapping в файл программа вылетает.
Вот мои наработки :
Classes.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct unit // "Блок"
{
    int t; // Техническая перменная
    char *mapping;
    bool accessibility;
    bool thereis; // Показывает, существует ли данный "блок"
};
unit wall;
unit ground;
unit tree;
int classes_main()
{
    wall.mapping="\xDB";
    wall.accessibility=false;
    wall.thereis=true;
    ground.mapping="\xB2";
    ground.accessibility=true;
    ground.thereis=true;
    tree.mapping="\xED";
    tree.accessibility=false;
    tree.thereis=true;
return 0;
}
Game.cpp
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <fstream>
#include <Classes.h>
using namespace System;
using namespace std;
int main()
{
    ifstream in; // Поток in будем использовать для записи
    ofstream out; // Поток out будем использовать для записи
    in.open("input.txt");
    out.open("output.txt");
    srand ( time(NULL));
    Console::SetWindowSize (120, 50);
    SetConsoleTitle("Ultra Old-Shcool RPG Game");
    int a,b; // "Технические" переменные
    unsigned int points=10,ag=10,str=10,mpmax=100,hpmax=100,df=10,mp,hp; // Переменные характеристик игрока
    char name[36];
    system("color 8F"); // Меняет цвет консоли и текста
    cout <<"\n \n \t \t \t \t \t  \x04 Hi! It's very old-school game! \x04 \n";
    cout <<"\n\n\t\t\t\t\t\tTell your name, hero! \n \n";
    cin >>name;
    system("cls"); // Очистка экрана 
    int xx[2056]; // Массивы координат
    unit x[2056]; // Символы присвоенные координатам
    for (int i=0;2056;i++)
    {
        xx[i]=(rand()+47)/4;
        if (xx[i]<1000)
        {
        x[i]=tree;
        in>>x[i].mapping;
        }
        if (xx[i]<2500)
        {
        x[i]=wall;
        in>>x[i].mapping;
        }
        else
        {
        x[i]=ground;
        in>>x[i].mapping;
        }
    }
    cout <<"\n \n \t \t \t \t \t \t CONTROLS \n \n \t \t 'Space' to skip text \n";
    while(getch()!=32); // Продолжение действий при нажатии на пробел
    system("cls");
    cout <<"\n \n \t \t \t \t \t Okay, "<<name<<" did you prepare for journey?\n \n";
    while(getch()!=32);
    system("cls");
    cout <<"\n \n \t \t \t \t \t Then, let the journey BEGIN!\n";
    while(getch()!=32);
    system("cls");
    cout <<"\n \t \t \t Tell your characteristics, "<<name<<"! \n \n";
    while(getch()!=32);
    {
a:
        system("cls");
        system("color 07");
        cout <<" Your Agility is "<<ag
        <<"\n \n Your Strenght is "<<str
        <<"\n \n Your Defence is "<<df
        <<"\n \n Your Mana is "<<mpmax
        <<"\n \n Your Health is "<<hpmax
        <<"\n \n You have "<<points<<" points.";
        if (points>=1)
            cout <<"\n \n \t \t \t Do you want to increase or decrease stats? \n \n type 1 to increase and 0 to decrease \n";
        if (points<1)
            cout <<"\n \n \t \t \t Do you want to increase or decrease stats, or you done? \n \n type 1 to increase and 0 to decrease, 2 if done \n";
        cin >>b;
        while (b==2 && points==0)
        {
            goto b;
        }
        while (b==0)
        {
            cout <<"What you want to decrease? \n 1 - Agility \n 2 - Strenght \n 3 - Defense \n 4 - Mana \n 5 - Health \n";
            cin >>b;
            if (b==1)
            {
                if (ag>1)
                {
                ag=ag-1;
                points=points+1;
                goto a;
                }
                else
                {
                system("cls");
                cout <<"You can't make your agility lower!";
                while(getch()!=32);
                goto a;
                }
            }
            if (b==2)
            {
                if (str>1)
                {
                str=str-1;
                points=points+1;
                goto a;
                }
                else
                {
                system("cls");
                cout <<"You can't make your strenght lower!";
                while(getch()!=32);
                goto a;
                }
            }
            if (b==3)
            {
                if (df>1)
                {
                df=df-1;
                points=points+1;
                goto a;
                }
                else
                {
                system("cls");
                cout <<"You can't make your defence lower!";
                while(getch()!=32);
                goto a;
                }
            }
            if (b==4)
            {
                if (mpmax>20)
                {
                mpmax=mpmax-10;
                points=points+1;
                goto a;
                }
                else
                {
                system("cls");
                cout <<"You can't make your mana lower!";
                while(getch()!=32);
                goto a;
                }
            }
            if (b==5)
            {
                if (hpmax>20)
                {
                hpmax=hpmax-10;
                points=points+1;
                goto a;
                }
                else
                {
                system("cls");
                cout <<"You can't make your health lower!";
                while(getch()!=32);
                goto a;
                }
            }
        }
        if (b==1 && points>0)
        {
            cout <<"What you want to increase? \n 1 - Agility \n 2 - Strenght \n 3 - Defense \n 4 - Mana \n 5 - Health \n";
            cin >>b;
            if (b==1)
            {
                ag=ag+1;
                points=points-1;
                goto a;
            }
            if (b==2)
            {
                str=str+1;
                points=points-1;
                goto a;
            }
            if (b==3)
            {
                df=df+1;
                points=points-1;
                goto a;
            }
            if (b==4)
            {
                mpmax=mpmax+10;
                points=points-1;
                goto a;
            }
            if (b==5)
            {
                hpmax=hpmax+10;
                points=points-1;
                goto a;
            }
        }
        else
        {
            system("cls");
            cout <<"\n \t \t \t You don't have enought points! \n";
            while(getch()!=32);
            goto a;
        }
b:
        system("cls");
        cout <<"\n \n \t \t \t \t \t Once, at the dark times of myth and legends..."; //Story
        while(getch()!=32);
    }
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2012, 02:59
Ответы с готовыми решениями:

Ошибка при записи структуры в файл
Доброго времени суток, уважаемые! В общем суть проблемы в следующем: При записи в файл структуры,...

Кракозябры вместо слов и цифр при записи структуры в файл
Помогите, пожалуйста! Создаю файл, записываю в него структуру, записывается кракозябра вместо слов...

Ошибка при чтении записи строки и вылет в другой код
Все работало хорошо, но вдруг что-то пошло не так и при чтении из файла в массив чаров вылетает в...

Вылет программы при попытке открыть файл
Добрый день. Столкнулся с такой ситуёвиной. При попытке открыть файл функцией CreateFile если в...

16
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
04.01.2012, 03:05 2
29 стока.
for(i = 0; i < 2056; i++)
Ваше условие (2056) всегда истина.
0
5 / 5 / 0
Регистрация: 04.01.2012
Сообщений: 41
04.01.2012, 03:11  [ТС] 3
Цитата Сообщение от NoMasters Посмотреть сообщение
29 стока.
for(i = 0; i < 2056; i++)
Ваше условие (2056) всегда истина.
Проблема именно с in>>x[i].mapping
Я проверял его работу без цикла.
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
04.01.2012, 03:21 4
А память кто выделять будет под этот самый mapping?
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
04.01.2012, 03:22 5
У вас в структуре есть указатель на символ, а Вы не выделяя память пишите туда данные
C++
1
wall.mapping="\xDB";
так делать нельзя, где-то дальше это нельзя и проявляется.
Писать программу на 200 строк где переменные названы, x, xx, a,b,i да ещё и использовать goto - зло и чтобы теперь помочь вам найти ошибку нужно потратить много времени что будет отпугивать форумчан.
1
5 / 5 / 0
Регистрация: 04.01.2012
Сообщений: 41
04.01.2012, 03:27  [ТС] 6
Цитата Сообщение от Gepar Посмотреть сообщение
У вас в структуре есть указатель на символ, а Вы не выделяя память пишите туда данные
C++
1
wall.mapping="\xDB";
так делать нельзя, где-то дальше это нельзя и проявляется.
Писать программу на 200 строк где переменные названы, x, xx, a,b,i да ещё и использовать goto - зло и чтобы теперь помочь вам найти ошибку нужно потратить много времени что будет отпугивать форумчан.
Извините, я просто совсем новенький в C++
А не подскажете, как точно надо выделять память?
Нечто вроде
C++
1
x[i].mapping = new char[10];
не помогает.
0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
04.01.2012, 03:41 7
volchonokilli, это же почему не помогает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct unit // "Блок"
{
        int t; // Техническая перменная
        char *mapping;
        bool accessibility;
        bool thereis; // Показывает, существует ли данный "блок"
};
 
int main()
{
    unit x;
    x.mapping=new char[10];
    x.mapping="string";
    cout<<x.mapping;
}
А вообще лучше бы вы в структуре своей использовали бы уже массив символов, char[10] тот же например, или вообще string ... хотя с последним будет сложнее писать в файл, особенно новичку так что лучше остановитесь на варианте char[10].
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
04.01.2012, 03:50 8
Может быть десяти символов не хватает(учитывая завершающий ноль)?

Gepar, сравни адреса, на которые у тебя указывает mapping до и после присвоения в 13.
0
5 / 5 / 0
Регистрация: 04.01.2012
Сообщений: 41
04.01.2012, 03:54  [ТС] 9
Classes.h не изменял, вот измененный отрезок из Game.cpp
Программа продолжает сбоить.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    int xx[2056]; // Массивы координат
    unit x[2056]; // Символы присвоенные координатам
    for (int i=0;i<2056;i++)
    {
        x[i].mapping=new char[10];
        xx[i]=(rand()+47)/4;
        if (xx[i]<1000)
        {
        x[i].mapping=tree.mapping;
        in>>x[i].mapping;
        }
        if (xx[i]<2500)
        {
        x[i].mapping=wall.mapping;
        in>>x[i].mapping;
        }
        else
        {
        x[i].mapping=ground.mapping;
        in>>x[i].mapping;
        }
    }
0
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
04.01.2012, 04:08 10
Вынеси

C++
1
x[i].mapping=new char[10];
за цикл! а то получается что ты выделяешь память 2056 раз!

И если ты выделяешь память то обязательно ее нужно очистить с помощью delete
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
04.01.2012, 04:09 11
Цитата Сообщение от NoMasters Посмотреть сообщение
Gepar, сравни адреса, на которые у тебя указывает mapping до и после присвоения в 13.
Сравнил, всё тот же, в моём случае можно обойтись без strcpy если Вы об этом.

Цитата Сообщение от volchonokilli Посмотреть сообщение
Программа продолжает сбоить.
У вас там целая куча всякой всячины и странных переменных, Вы бы оттестировали свой класс пытаясь для начала заставить его работать печатая данные на экран, потом попытались бы записать один объект вашей структуры в файл, а потом уже целый массив объектов пробовали бы экспортировать в файл, это хорошо что Вы сразу ещё интерфейс не прикрутили и лишь потом не заметили что структура то не рабочая ...
0
5 / 5 / 0
Регистрация: 04.01.2012
Сообщений: 41
04.01.2012, 04:10  [ТС] 12
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Вынеси

C++
1
x[i].mapping=new char[10];
за цикл! а то получается что ты выделяешь память 2056 раз!

И если ты выделяешь память то обязательно ее нужно очистить с помощью delete
Тогда придется убирать [i], а без него компилятор не воспринимает х, как элемент структуры.

Цитата Сообщение от Gepar Посмотреть сообщение
У вас там целая куча всякой всячины и странных переменных, вы бы оттестировали свой класс пытаясь для начала заставить его работать печатая данные на экран, потом попытались бы записать один элемент в файл, а потом уже в массив, это хорошо что Вы сразу ещё интерфейс не прикрутили и лишь потом не заметили что структура то не рабочая ...
Всё работает кроме самого mapping.
То есть, программа каждый раз сбоит при попытке отоображения или записи, например, wall.mapping, которое равно "\xDB".
При этом присваивание проходит без сбоев.
0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
04.01.2012, 04:17 13
Цитата Сообщение от Infinity3000 Посмотреть сообщение
за цикл! а то получается что ты выделяешь память 2056 раз!
Ага, что удивительно, ведь он создал 2056 объектов своего класса, с чего это он память тогда аж 2056 раз выделяет, первому выдал и хватит. Давайте как у нас в обществе поступать: очередь на квартиру в 2056 человек, а мы первому дадим и всё
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
04.01.2012, 04:28 14
Цитата Сообщение от Gepar Посмотреть сообщение
Сравнил, всё тот же, в моём случае можно обойтись без strcpy если Вы об этом.
Это очень странно, ведь адрес(который присваивается) у сроки совсем не тот, что у выделенной памяти.
volchonokilli, думаю, проблема в том, что cin пытается запихнуть в mapping куда больше, чем можно. input.txt в студию

Добавлено через 1 минуту
Цитата Сообщение от volchonokilli Посмотреть сообщение
То есть, программа каждый раз сбоит при попытке отоображения или записи, например, wall.mapping, которое равно "\xDB".
Это уже после того, как память была выделена?
0
5 / 5 / 0
Регистрация: 04.01.2012
Сообщений: 41
04.01.2012, 04:28  [ТС] 15
Цитата Сообщение от NoMasters Посмотреть сообщение
volchonokilli, думаю, проблема в том, что cin пытается запихнуть в mapping куда больше, чем можно. input.txt в студию
input.txt размер - 0 байт.
И да, у меня там нету cin
Цитата Сообщение от NoMasters Посмотреть сообщение
Это уже после того, как память была выделена?
Да.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
04.01.2012, 09:06 16
Цитата Сообщение от volchonokilli Посмотреть сообщение
но при выполнении записи x[i].mapping в файл программа вылетает.
Вы нигде не пишете в файл. Вы пытаетесь считать из файла.
0
5 / 5 / 0
Регистрация: 04.01.2012
Сообщений: 41
22.01.2012, 01:50  [ТС] 17
Проблема решена.
Оказалось, что структура записывается немного другим образом (нечто вроде in((char*)wall,sizeof(unit)) ).
0
22.01.2012, 01:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2012, 01:50
Помогаю со студенческими работами здесь

Вылет при попытке открыть типизированный файл для чтения
При двукратном нажатие на кнопку, для которой написана процедура, программа &quot;вылетает&quot;. Методом...

Схема записи структуры в файл
Как записать схему записи структуры в файл? вот функцияint BinFile::DecToBin (int a,int* A) { ...

Нарушение прав доступа при записи по адресу 0х00000000 при добавлении элемента структуры
прошу помощи, выбивает эту ошибку при добавлении элемента структуры, также приму во внимание другие...

Как записать в бинарный файл структуры записи из текстового файла?
Здравствуйте! Прошу помочь с чтением из текстового файла а затем запись всего что записано в...

Проверка на совпадение последней и следующей записи при записи в файл
Доброго времени суток) У меня в файл записывается произошло соединение с сервером или нет, но...

Создать двоичный файл, содержащий записи следующей структуры для хранения информации об авиарейсе
Создать двоичный файл, содержащий записи следующей структуры для хранения информации об авиарейсе:...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru