С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 27.04.2020
Сообщений: 59
1

Исключение в xmemory по окончанию работы программы (При работе с файлом)

01.02.2021, 20:05. Показов 1386. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Есть класс User, который хранит в себе некоторые данные (Не знаю нужна ли это информация, но вот класс)
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
#pragma once
 
#include <string>
#include <iostream>
 
class User
{
    std::wstring username;
    size_t nCount; // всего попыток
    size_t nTrue; // правильных ответов
    size_t nFalse; // неправильный ответов
    size_t nRepeat; // повторное решение примеров
    size_t withHint; // решение с подсказками
 
 
public:
    User() : User(L"") {}
    User(std::wstring username)
    {
        this->username = username;
        nCount = 0;
        nTrue = 0;
        nFalse = 0;
        nRepeat = 0;
        withHint = 0;
    }
 
    // -- сеттеры --
    void set_username(std::wstring username) { this->username = username; }
    void set_nCount(size_t nCount) { this->nCount = nCount; }
    void set_nTrue(size_t nTrue) { this->nTrue = nTrue; }
    void set_nFalse(size_t nFalse) { this->nFalse = nFalse; }
    void set_nRepeat(size_t nRepeat) { this->nRepeat = nRepeat; }
    void set_withHint(size_t withHint) { this->withHint = withHint; }
    // -- геттеры --
    std::wstring get_username() const noexcept { return username; }
    size_t get_nCount() const noexcept { return nCount; }
    size_t get_nTrue() const noexcept { return nTrue; }
    size_t get_nFalse() const noexcept { return nFalse; }
    size_t get_nRepeate() const noexcept { return nRepeat; }
    size_t get_withHint() const noexcept { return withHint; }
    // -- операция сравнения по имени пользователя --
    bool operator==(const User& other);
    // -- сложение данных одного пользователя --
    User operator+=(const User& other);
    friend User operator+(const User& first, const User& second);
 
};
Есть вектор таких объектов. В начале программы необходимо прочитать бинарный файл, взять из него эти объекты и поместить в вектор. По окончанию работы программы, заново заполнить файл данными из этого вектора
Функция чтения данных:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void ReadUsersFromFile()
{
    HANDLE file = CreateFile(TEXT("UserData.bin"), GENERIC_READ, FILE_SHARE_READ, NULL,
        OPEN_EXISTING, 0, NULL);
    DWORD buffer;
    LARGE_INTEGER size;
    User user;
    GetFileSizeEx(file, &size);
        // Число элементов = size.QuadPart / sizeof(user).
    size_t countObj = size.QuadPart / sizeof(user);
    for (size_t i = 0; i < countObj; ++i)
    {
        AllSeansUsers.push_back(user);
    }
    for (size_t i = 0; i < countObj; ++i)
    {
        ReadFile(file, &AllSeansUsers[i], sizeof(AllSeansUsers[i]), &buffer, NULL);
    }
    CloseHandle(file);
}
Функция записи данных:
C++
1
2
3
4
5
6
7
8
9
10
11
void WriteUsersInFile()
{
    DWORD buffer;
    HANDLE file = CreateFile(TEXT("UserData.bin"), GENERIC_WRITE, FILE_SHARE_READ, NULL,
        OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    for (size_t i = 0; i < AllSeansUsers.size(); ++i)
    {
        WriteFile(file, &AllSeansUsers[i], sizeof(AllSeansUsers[i]), &buffer, NULL);
    }
    CloseHandle(file);
}
И вот вроде работает, но по окончанию работы программы, она выдает исключение в xmemory. Я так понял чтении данных из файла есть проблемы с памятью, но не понял как решить проблему. Какие есть варианты?

Добавлено через 52 минуты
Изменил сборку проект с Debugx86 на Releasex86 и проблемы больше нет. Но все таки такое странное поведение программы настораживает и хотелось бы знать, в чем проблема
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2021, 20:05
Ответы с готовыми решениями:

Ошибка при работе программы с текстовым файлом
Суть программы - Если строка начинается с цифры, то перед ней поставить левую круглую скобку, а в...

При работе программы вылетает исключение NullReferenceException
Добрый вечер, при работе программы выливает исключение на строчки вот само исключение //Copy...

Выход из программы по окончанию ее работы
Пишу консольное приложение и хочу запускать его через терминал. Но по окончанию работы программа не...

Ошибка по окончанию работы программы: Runtime error 104 at 0000:05fc
по окончании работы программы программы, после всех расчетов, появляется строка runtime error 104...

2
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
01.02.2021, 20:36 2
Цитата Сообщение от Doppelganker Посмотреть сообщение
Но все таки такое странное поведение программы настораживает и хотелось бы знать, в чем проблема
Цитата Сообщение от Doppelganker Посмотреть сообщение
ReadFile(file, &AllSeansUsers[i], sizeof(AllSeansUsers[i]), &buffer, NULL);
Объекты класса Users, в частности username, нельзя читать побайтово при помощи ReadFile.
Либо сделай
C++
1
2
3
4
5
class User
{
    wchar_t username[256];
    size_t nCount; // всего попыток
    size_t nTrue; // правильных ответов
Добавлено через 32 секунды
Либо читай/пиши поля по-отдельности

Добавлено через 1 минуту
Цитата Сообщение от Doppelganker Посмотреть сообщение
// -- сложение данных одного пользователя --
    User &operator+=(const User& other);
Это просто как правильно делать такой оператор

Добавлено через 2 минуты
Цитата Сообщение от Doppelganker Посмотреть сообщение
User(std::wstring username)
Цитата Сообщение от Doppelganker Посмотреть сообщение
void set_username(std::wstring username)
Цитата Сообщение от Doppelganker Посмотреть сообщение
std::wstring get_username() const noexcept
Используй везде const std::wstring & вместо просто std::wstring. Особенно в последнем случае, иначе он нифига не noexcept
0
1 / 1 / 0
Регистрация: 27.04.2020
Сообщений: 59
01.02.2021, 22:09  [ТС] 3
oleg-m1973, Спасибо большое!
0
01.02.2021, 22:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2021, 22:09
Помогаю со студенческими работами здесь

Исключение при работе с pictureBox (задание картинки при работе с формой)
Хочу задать изображение в компоненте pictureBox во время разработки формы, чтоб при запуске проги...

Как в консольном приложении по окончанию работы программы задать возврат кода ошибки (ErrorLevel)
Вот возьмем консольный WinRar, к примеру. Код возврата|Описание 0|Операция успешно завершена....

Написание программы с использованием файловых переменных. Разработка программы для работы с текстовым файлом
Помогите пожалуйста : С помощью текстового редактора создать текстовый файл file1. Переписать...

Ошибка при использовании ADODB.CONNECTION при работе с dbf-файлом
Добрый день! Написала макрос с использованием adodb.connection. макрос удаляет строки из файла dbf....

Закрывает консоль при выходе из функции, при работе с файлом!
Функция: void ShowList() { ifstream out(FileName); //FileName - путь к файлу Car...

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


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

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