Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
11 / 11 / 10
Регистрация: 26.12.2017
Сообщений: 48
1

Структура, деструктор, файлы, траблы

15.04.2018, 18:35. Просмотров 934. Ответов 9
Метки нет (Все метки)

Короче, нужна помощь.
Есть файл info.txt.
Есть структура student.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct student {
    std::string name;
    std::string secondname;
    std::string thirdname;
    int age;
    int course;
    double yspevaemost;
    void add_struct_in_file();
    student();
    void vvod_info();
    void save_in_file();
    void save_in_file_end();
    void change();
    int change_menu();
    void vivod_info();
    ~student();
};
в ней есть деструктор ~student();
C++
1
2
3
4
5
6
7
8
9
10
student::~student() {
    ofstream g("info.txt", ios::end);
    g << endl << name << " "
        << secondname << " "
        << thirdname << " "
        << age << " "
        << course << " "
        << yspevaemost;
    g.close();  
}
при создании массива структур, открывается файл, считывается кол-во строк. Создаётся массив структур и считывается через конструктор информация. После этого я хочу удалить массив структур.
Пишу delete[]student. Но информация назад не записывается. Записывается только самый первый элемент. Можно ли это как-то исправить???
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2018, 18:35
Ответы с готовыми решениями:

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит деструктор B?

Структура содержащая QString и ее деструктор
Есть простая структура struct item { QString AnyString; }; struct item*...

Траблы с визуалкой и sql в чем траблы незнаю
Все работало нормально что визуалка что сам sql. а тут хз что за ошибка. Таже ошибка и в визуалке.

Файлы и структура
Дан файл OFFICE, содержащий сведения о сотрудниках фирмы (фамилия, имя, год рождения, стаж)....

9
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
15.04.2018, 19:28 2
Цитата Сообщение от d1scret0 Посмотреть сообщение
ней есть деструктор ~student();
Не нужен тут деструктор.
Цитата Сообщение от d1scret0 Посмотреть сообщение
Создаётся массив структур
Покажи как.
0
11 / 11 / 10
Регистрация: 26.12.2017
Сообщений: 48
15.04.2018, 19:30  [ТС] 3
C++
1
student *studentx = new student[number_student];
где number_student это кол-во студентов
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
15.04.2018, 19:33 4
Освобождение памяти:
C++
1
delete [] studentx;
После этого можешь открыть и закрыть файл для записи, чтобы данные из файла были стёрты.
0
11 / 11 / 10
Регистрация: 26.12.2017
Сообщений: 48
15.04.2018, 19:39  [ТС] 5
не работает, записывает только 1 студента. Но я сделал так. Создал фукнцию записи в файл одного студента. И запихнул это в деструктор. И, оно, работает...
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
15.04.2018, 19:42 6
Цитата Сообщение от d1scret0 Посмотреть сообщение
не работает, записывает только 1 студента.
Что не работает? При чём здесь запись?
Цитата Сообщение от d1scret0 Посмотреть сообщение
Создал фукнцию записи в файл одного студента. И запихнул это в деструктор.
...
Цитата Сообщение от nd2 Посмотреть сообщение
Не нужен тут деструктор.
1
11 / 11 / 10
Регистрация: 26.12.2017
Сообщений: 48
15.04.2018, 19:47  [ТС] 7
Короче. У меня есть база данных струдентов. Я создал структуру студент. При создании массива студентов вызывается конструктор, который считывает информацию из файла. Потом всякие действия по типу изменить что-то. Потом я хочу это перезаписать в файл. Для этого я сделал конструктор. Который записывает информацию в файл. Но он не работал. После этого я добавил в структуру функцию, которая записывает информацию о студенту в файл. Записал эту функцию в структуру. И теперь при удалении массива структур
C++
1
delete[]studentx
у меня записывается вся информация в файл. Не спрашивай как. Я сам хз.
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
15.04.2018, 19:54 8
Цитата Сообщение от d1scret0 Посмотреть сообщение
Для этого я сделал конструктор. Который записывает информацию в файл.
Не нужен для этого конструктор.
Цитата Сообщение от d1scret0 Посмотреть сообщение
Но он не работал.
И правильно делал.
Цитата Сообщение от d1scret0 Посмотреть сообщение
После этого я добавил в структуру функцию, которая записывает информацию о студенту в файл
Правильно.
Цитата Сообщение от d1scret0 Посмотреть сообщение
Записал эту функцию в структуру.
Правильно.
Дальше, что хочешь?

Добавлено через 39 секунд
Это:
Цитата Сообщение от d1scret0 Посмотреть сообщение
Потом я хочу это перезаписать в файл.
Добавлено через 1 минуту
Если это, то, в цикле, вызываешь функцию записи данных студента для каждого элемента блока studentx.
В фукнции (которая в структуре) не должно быть открытия файла для записи, это должно быть сделано один раз до обработки блока.
0
11 / 11 / 10
Регистрация: 26.12.2017
Сообщений: 48
15.04.2018, 19:58  [ТС] 9
Цитата Сообщение от nd2 Посмотреть сообщение
Дальше, что хочешь?
Я хотел чтобы записывалась измененная информация в файл. Я хотел чтобы при удаления массива она записывалась. Поэтому я хотел сделать деструктор который удаляет поэлементно. Но оно не работало. И я сделал функцию в структуре которая записывает в файл. И потом эту функцию вызвал в деструкторе.

Добавлено через 1 минуту
функция в структуре
C++
1
2
3
4
5
6
7
8
9
10
void student::save_in_file_end() {
    ofstream g("info.txt", ios::app);
    g << endl << name << " "
        << secondname << " "
        << thirdname << " "
        << age << " "
        << course << " "
        << yspevaemost;
    g.close();
};
деструктор
C++
1
2
3
student::~student() {
    save_in_file_end();
}
Вот это работает. А было вот так
C++
1
2
3
4
5
6
7
8
9
10
student::~student() {
    ofstream g("info.txt", ios::app);
    g << endl << name << " "
        << secondname << " "
        << thirdname << " "
        << age << " "
        << course << " "
        << yspevaemost;
    g.close();
}
И оно не работало
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
15.04.2018, 20:16 10
Лучший ответ Сообщение было отмечено d1scret0 как решение

Решение

Цитата Сообщение от d1scret0 Посмотреть сообщение
Вот это работает.
Оно может и работает, но это всё должно не так быть. Смотри, когда ты делаешь это:
C++
1
delete[]studentx
деструктор будет вызван для каждого элемента блока (т.е., number_student раз). Столько же раз будет вызвана и функция save_in_file_end(). Разве это рационально?
Убери деструктор, для твоего класса он не нужен. Сделай отдельную функцию, для записи блока студентов в файл (файл там открывай для записи, а не для дозаписи), передавай туда указатель на блок студентов, и размер блока. Вызовешь её перед освобождением памяти под блоком. Всё.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2018, 20:16

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Структура и файлы
Здрасте всем! написал программу про структуру TRAIN, Проблема в следующем: когда идет вывод на...

структура и файлы
Нужно выделить динамическую память под структуру, затем записать все записи в файл и считать из...

Структура и файлы прямого доступа
У меня стоит такое задание: Разработать приложение для построения таблицы слов заданного размера...

Исправление ошибок. Файлы. Структура
Прошу, помогите найти ошибки. Первые попытка ваяния на билдере. Записывает криво, считывает криво в...


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

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

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