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

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

Войти
Регистрация
Восстановить пароль
 
pstoster
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 4
#1

Динамический массив объектов класса и считывание двоичных файлов - C++

05.02.2016, 20:53. Просмотров 310. Ответов 7
Метки нет (Все метки)

Долго бьюсь и не могу понять.
В этом варианте он выдает такую ошибку
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
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
 
class Forms
{
private:
    char clogin[20];
    char cpassword[10];
    int ctype;
public:
    Forms(char login[], char password[], int type)
    {
        strcpy(clogin, login);
        strcpy(cpassword, password);
        ctype = type;
    }
    Forms() {}
    void Print()
    {
        cout << clogin << endl << cpassword << endl << ctype << endl;
    }
};
 
void main()
{
    Forms* cforms;
    cforms = new Forms;
    char login[20], password[10];
    int type = 1, n = 0;
    ifstream forms("forms.bin", ios::binary);
    while (!forms.eof())
    {
        cforms[n] = Forms(login, password, type);
        n++;
    }
    forms.close();
    cout << n;
    for (int i = 0; i < n;i++)
    {
        cforms[i].Print();
    }   
    system("pause");
}
Динамический массив объектов класса и считывание двоичных файлов


В этом варианте он выдает такую ошибку
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
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
 
class Forms
{
private:
    char clogin[20];
    char cpassword[10];
    int ctype;
public:
    void SetClogin( char *login) { strcpy(clogin, login); }
    void SetCpassword(char *password) { strcpy(cpassword, password); }
    void SetCtype(int type) { ctype = type; }
    void Print()
    {
        cout << clogin << endl << cpassword << endl << ctype << endl;
    }
};
 
void main()
{
    Forms* cforms;
    cforms = new Forms;
    char login[20], password[10];
    int type = 1, n = 0;
    ifstream forms("forms.bin", ios::binary);
    while (!forms.eof())
    {
        forms.read((char*)&login, sizeof(login));
        forms.read((char*)&password, sizeof(password));
        forms.read((char*)&type, sizeof(int));
        cforms[n].SetClogin(login);
        cforms[n].SetCpassword(password);
        cforms[n].SetCtype(type);
        n++;
    }
    forms.close();
    cout << n;
    for (int i = 0; i < n;i++)
    {
        cforms[i].Print();
    }   
    system("pause");
}
Динамический массив объектов класса и считывание двоичных файлов

И в обоих версиях почему то по два раза считывает последние данные с двоичного файла.
Кто знает в чем подвох? Уже как только не исправлял и ничего.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2016, 20:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Динамический массив объектов класса и считывание двоичных файлов (C++):

Динамический массив объектов класса - C++
Здравствуйте. Возник вопрос, на который не получается найти понятного ответа. Есть класс Point: #include &lt;iostream&gt; #include...

Динамический массив объектов класса - C++
Как вместо статически введённых 5 объектов использовать ввод переменной во время выполнения программы, которая будет иметь значение, а...

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

Запись и считывание объектов класса в/из файла - C++
Здравствуйте! Помогите, пожалуйста, разобраться с проблемой. Нужно записать объект класса в файл и после считать его. Код работает, но,...

Считывание файла в динамический массив построчно - C++
Все мои варианты зависали или вылетали при большом колличество слов в файле.. Если же слов в районе 50, всё работало.. помогите пожалуйста....

динамический массив объектов - C++
помогите с функцией PrintGarage, чтоб она выводила массив объектов Garage int main(){ char model; int number = 0; int run =...

7
nord_v
329 / 177 / 69
Регистрация: 22.08.2013
Сообщений: 724
06.02.2016, 00:29 #2
Цитата Сообщение от pstoster Посмотреть сообщение
cforms = new Forms;
Это выделение памяти под один объект.
Цитата Сообщение от pstoster Посмотреть сообщение
C++
1
2
3
4
5
6
7
ifstream forms("forms.bin", ios::binary);
while (!forms.eof())
{
    cforms[n] = Forms(login, password, type);
    n++;
}
forms.close();
Гед здесь чтение из файла? Присваивание идёт за пределы выделенной памяти.
0
pstoster
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 4
06.02.2016, 16:00  [ТС] #3
Упс в этом коде упустил строчку
C++
1
2
3
4
5
6
7
8
9
10
 ifstream forms("forms.bin", ios::binary);
    while (!forms.eof())
    {
        forms.read((char*)&login, sizeof(login));
        forms.read((char*)&password, sizeof(password));
        forms.read((char*)&type, sizeof(int));
        cforms[n] = Forms(login, password, type);
        n++;
    }
    forms.close();
А разве не будет работать как в динамическом массиве, когда заранее не указываешь сколько элементов будет?
0
nord_v
329 / 177 / 69
Регистрация: 22.08.2013
Сообщений: 724
06.02.2016, 16:04 #4
Цитата Сообщение от pstoster Посмотреть сообщение
как в динамическом массиве
В каком динамическом массиве?
0
pstoster
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 4
06.02.2016, 16:30  [ТС] #5
Например простой массив
C++
1
int *mas3 = new int;
0
nord_v
329 / 177 / 69
Регистрация: 22.08.2013
Сообщений: 724
06.02.2016, 16:33 #6
Цитата Сообщение от pstoster Посмотреть сообщение
Например простой массив
Память выделена под один int, и так будет пока сам не выделишь память большего размера.
Или используй классы с автоматическим управлением памятью (например, vector).
0
pstoster
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 4
06.02.2016, 17:13  [ТС] #7
А что насчет двоичных файлов? Я записал логин, пароль, тип, логин, пароль, тип, но при чтении он считывает последние данные два раза
0
nord_v
329 / 177 / 69
Регистрация: 22.08.2013
Сообщений: 724
06.02.2016, 17:26 #8
Цитата Сообщение от pstoster Посмотреть сообщение
но при чтении он считывает последние данные два раза
Считывает он один раз, а вот объект класса, с последними считанными данными, помещается в массив два раза. Проверяй поток на eof перед помещением объекта в массив, а не в параметрах while().
1
06.02.2016, 17:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2016, 17:26
Привет! Вот еще темы с ответами:

Динамический массив объектов - C++
Как определить объект Group, который будет содержать динамический массив объектов Person?

Массив объектов класса. Печать строк-членов класса. - C++
подскажите, как распечатать строки? #include &quot;myString.h&quot; #include &lt;iostream&gt; #define stop __asm nop void main() { ...

Массив объектов класса как член другого класса - C++
Здравствуйте. У меня тут возникла проблемка #include &quot;main.h&quot; class player { public: player(); player(char*); ...

Считывание структур из бинарного файла в динамический массив - C++
Доброго времени суток, форумчане, помогите пожалуйста, поделитесь знаниями или мне глаза откройте.. пишу программу(визуальное приложение)...


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

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

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