Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 9

Динамический массив объектов класса в функции

17.03.2017, 22:13. Показов 2098. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
У меня данные хранятся в файле, и, чтобы их отсортировать, я решил извлекать их из файла и записывать в динамический массив. А потом его передавать в qsort().
Размер, который должен быть у массива получаю, разделив размер файла в байтах(его возвращает функция СountSize()) на размер, нужный для обной переменной(класса goods).
Здесь все правильно, через отладку вижу, что вычисляет размер как надо,
C++
1
goods* Base = new goods[size];
но потом не создается массив. Отладка показывает Base как один объект, в него записывается первая запись файла и всё. Поэтому не происходит сортировка.
Подскажите, пожалуйста, если знаете, как решить проблему.
Вот функция для перегонки в массив
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
void ABC()
{
    
    
    
    int size = CountSize()/sizeof(goods);
    int count = 0;
    
    goods* Base = new goods[size];   //Злосчастный массив
 
    FILE *storage;
    storage = fopen("storage.txt", "rt");
    if (storage == NULL)
        return;
    do {
 
        fscanf(storage, "%s %d %d %d", Base[count].Name, &Base[count].Quantity, &Base[count].Cost, &Base[count].Date);
        
        count++;
        
    } while (!feof(storage));
    fclose(storage);
    
    abc = ABCcompare;//Указатель на функцию - признак сортировки(что больше, что меньше)
    qsort(Base, size, sizeof(goods), abc);
    storage = fopen("storage.txt", "w");
    count = 0;
    while (count < size)
    {
        fprintf(storage,"%s %d %d %d", Base[count].Name, Base[count].Quantity, Base[count].Cost, Base[count].Date);
        count++;
                 //Тут из массива все переписывается снова в файл
    }
    fclose(storage);
    
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.03.2017, 22:13
Ответы с готовыми решениями:

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

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

Динамический массив объектов класса и считывание двоичных файлов
Долго бьюсь и не могу понять. В этом варианте он выдает такую ошибку #include &lt;iostream&gt; #include &lt;fstream&gt; #include...

8
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.03.2017, 22:17
Если файл не бинарный, то размер в байтах ничего не даст. Надо делать холостой проход по файлу для подсчёта или постоянно увеличивать массив.
1
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
17.03.2017, 22:23
Лучший ответ Сообщение было отмечено Микита как решение

Решение

в файле похоже строки Name не фиксированной длинны. поэтому такой подсчет количества объектов не канает. Используйте std::vector<goods> или ченить похожее, динамически расширяемое и втыкайте в него объекты по мере их прочитывания.
1
56 / 56 / 31
Регистрация: 24.10.2016
Сообщений: 186
17.03.2017, 22:27
Интересно посмотреть на структуру goods
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
17.03.2017, 22:32
даже если в структуре goods для Name массив фиксированной длинны но строки не полностью его заполняют - то как минимум считывание тут будет кривое. а если они пишутся до первого нуля - то считывание может и будет корректным, но выделенной памяти в какой-то момент не хватит, т.к. тут расчет на то, что строки полностью заполняют массив.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
17.03.2017, 22:33
Цитата Сообщение от Микита Посмотреть сообщение
но потом не создается массив. Отладка показывает Base как один объект,
Данных типа массив там нет (есть блок данных в куче), а отладка показывает содержимое по адресу в указателе, поэтому и показывает один объект. Есть, в студии, способ, чтобы в отладке был виден весь блок данных в куче.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
17.03.2017, 22:41
Рядом с указателем, через запятую, прописать количество элементов.
Миниатюры
Динамический массив объектов класса в функции  
1
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 9
18.03.2017, 21:57  [ТС]
Спасибо всем за ответы! Решил использовать вектор, с ним все ОК.
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
void ABC()
{
    
    int count = 0;
    vector<goods> Myvect;
    
 
    FILE *stor;
    stor = fopen("storage.txt", "rt");
    if (stor == NULL)
        return;
    do {
        goods TheOne;
        fscanf(stor, " %d %s %d %d %d",&TheOne.i, TheOne.Name, &TheOne.Quantity, &TheOne.Cost, &TheOne.Date);
        Myvect.push_back(TheOne);
        count++;
    } while (!feof(stor));
 
    int size = count;
    fclose(stor);
    
    VectorSort(&Myvect, Myvect.size());
 
    FILE *storage;
    storage = fopen("storage.txt", "wt");
    count = 0;
    while (count < size)
    {
        fprintf(storage, " %d %s %d %d %d", count, Myvect.at(count).Name, Myvect.at(count).Quantity, Myvect.at(count).Cost, Myvect.at(count).Date);
        count++;
    }
 
    fclose(storage);
    Myvect.~vector();
    
}
вот класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class goods
{
public:
    char* Name;//в конструкторе по умолчанию делаю Name = new char [30];
    int Quantity;
    int Cost;
    int Date;
    int i;
    goods();
    goods(int, char*, int, int, int);
    void Set(char*);
    char* GetName();
    ~goods();
};
nmcf, верно, определение по коду для бинарных не пошло! Размер абы как зависит от числа строк)

nd2, я так и смотрел, он у меня из одного элемента, size = 5 был на входе(правда, от количества текста, действительно, не зависело)))
Впринципе, тема закрыта!

P.S. А есть ли смысл делать private строки в моём случае и методы get/set для них?
В С# же дурной тон паблик поля, считается... Просто и так длинное присваивание получается.
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
18.03.2017, 22:17
с таким goods у вас утечки памяти. или же UB, если в деструкторе таки делаете delete[] Name.
чтобы не иметь с этим проблем - используйте std::string. правда в этом случае придется немного считывание с файла поменять немного. а если scanf заменить на std::ifstream - то и это с этим проблем тоже не должно возникнуть.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.03.2017, 22:17
Помогаю со студенческими работами здесь

Динамический массив при наследовании, элементами которого являются объекты класса наследника динамический массив
Попробовал создать динамический массив, у которого элементы - объекты класса динамический массив, причем использовал класс-наследник от...

Динамический массив ,элементами которого являются объекты класса динамический массив
Доброго времени суток, захотел создать динамический массив ,элементами которого являются объекты класса динамический массив, если...

Как создать динамический масссив объектов класса
Видел, как создаются обычные динамический массивы, но сразу с указанием количества элементов, а что делать, если не знаю его количество?...

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru