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

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

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

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

05.02.2016, 20:53. Просмотров 241. Ответов 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");
}
Динамический массив объектов класса и считывание двоичных файлов

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

Динамический массив объектов C++
C++ Считывание файла в динамический массив построчно
Массив объектов класса. Печать строк-членов класса. C++
C++ динамический массив объектов
Создать динамический массив объектов, инициализировать его C++
C++ Передача в функцию динамический массив объектов первого и второго типа
C++ Как сделать динамический массив объектов?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nord_v
227 / 176 / 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();
Гед здесь чтение из файла? Присваивание идёт за пределы выделенной памяти.
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();
А разве не будет работать как в динамическом массиве, когда заранее не указываешь сколько элементов будет?
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 724
06.02.2016, 16:04     Динамический массив объектов класса и считывание двоичных файлов #4
Цитата Сообщение от pstoster Посмотреть сообщение
как в динамическом массиве
В каком динамическом массиве?
pstoster
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 4
06.02.2016, 16:30  [ТС]     Динамический массив объектов класса и считывание двоичных файлов #5
Например простой массив
C++
1
int *mas3 = new int;
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 724
06.02.2016, 16:33     Динамический массив объектов класса и считывание двоичных файлов #6
Цитата Сообщение от pstoster Посмотреть сообщение
Например простой массив
Память выделена под один int, и так будет пока сам не выделишь память большего размера.
Или используй классы с автоматическим управлением памятью (например, vector).
pstoster
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 4
06.02.2016, 17:13  [ТС]     Динамический массив объектов класса и считывание двоичных файлов #7
А что насчет двоичных файлов? Я записал логин, пароль, тип, логин, пароль, тип, но при чтении он считывает последние данные два раза
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2016, 17:26     Динамический массив объектов класса и считывание двоичных файлов
Еще ссылки по теме:

C++ Динамический массив динамических объектов
Динамический массив объектов класса C++
C++ Запись и считывание объектов класса в/из файла
Как можно создать динамический массив объектов fstream? C++
C++ Создать динамический массив объектов пользовательского типа

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

Или воспользуйтесь поиском по форуму:
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 724
06.02.2016, 17:26     Динамический массив объектов класса и считывание двоичных файлов #8
Цитата Сообщение от pstoster Посмотреть сообщение
но при чтении он считывает последние данные два раза
Считывает он один раз, а вот объект класса, с последними считанными данными, помещается в массив два раза. Проверяй поток на eof перед помещением объекта в массив, а не в параметрах while().
Yandex
Объявления
06.02.2016, 17:26     Динамический массив объектов класса и считывание двоичных файлов
Ответ Создать тему
Опции темы

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