Ошибка записи в память?

250
24 ноября 2021, 13:10

https://pastebin.com/Cz7Dti3N Полный рабочий кусок

void Admin::read_admins()
{
    FILE* f;
    f = fopen("admins", "rb");
    fread(&Admin::admins_size, sizeof(int), 1, f);
    fread(admins, sizeof(Admin), Admin::admins_size, f);
    fclose(f);
    for (int i = 0; i < Admin::admins_size; i++)
    {
        admins[i].login = decode_string(admins[i].login);
        admins[i].password = decode_string(admins[i].password);
        admins[i].permission = decode_string(admins[i].permission);
    }
}
void Admin::write_admins()
{
    for (int i = 0; i < Admin::admins_size; i++)
    {
        admins[i].login = code_string(admins[i].login);
        admins[i].password = code_string(admins[i].password);
        admins[i].permission = code_string(admins[i].permission);
    }
    FILE* f;
    f = fopen("admins", "w+b");
    fwrite(&Admin::admins_size, sizeof(int), 1, f);
    fwrite(admins, sizeof(Admin), Admin::admins_size, f);
    fclose(f);
    for (int i = 0; i < Admin::admins_size; i++)
    {
        admins[i].login = decode_string(admins[i].login);
        admins[i].password = decode_string(admins[i].password);
        admins[i].permission = decode_string(admins[i].permission);
    }
}

Это функции записи и считывания файла в массив админов.

string code_string(string str)
{
    char* s;
    s = new char[str.length() + 1];
    strcpy(s, str.c_str());
    for (unsigned int i = 0; i < str.length(); i++)
    {
        s[i] += code_key;
    }
    string s2(s);
    delete[] s;
    return s2;
}
string decode_string(string str)
{
    char* s;
    s = new char[str.length() + 1];
    strcpy(s, str.c_str());
    for (unsigned int i = 0; i < str.length(); i++)
    {
        s[i] -= code_key;
    }
    string s2(s);
    delete[] s;
    return s2;
}

Это код и декод.
Суть проблемы в том, что при считывании файла у меня вылетает Access violation writing location 0x0072006D.
Декод работает правильно и возвращает правильное значение, с таким же размером, как и ориг строка. Массив админов изначально размера 100 и Admin::admins_size это кол-во записанных админов.
При считывании даже первого админа именно на приравнивании admins[i].login = decode_string(admins[i].login); вылетает. Там индекс i=0, массив размера 100. В 0 элементе уже есть значение строки в зашифрованном виде

User users[100];
Admin admins[100];
string currentLogin;
int code_key = 5;

Если убрать строки с кодом-декодом всё работает нормально, записывается и читает

READ ALSO
Как решить эту задачу используя указатели?(по массиву можно двигаться только с помощью них)

Как решить эту задачу используя указатели?(по массиву можно двигаться только с помощью них)

Дано натуральное число n (<= 100)Получить все простые числа, не превышающие это значение

195
Как получить доступ к элементам динамического массива по ссылке?

Как получить доступ к элементам динамического массива по ссылке?

Есть динамический массив объектов, как передать его в функцию и получить доступ к отдельному элементу?

165
Возможно ли переделать файл с расширением .ino( Arduino) и запустить в среде Visual studio?

Возможно ли переделать файл с расширением .ino( Arduino) и запустить в среде Visual studio?

То есть мне надо использовать библиотеку Arduino и запустить код в своей среде

111
Как анимировать элементы на QQuickPaintedItem?

Как анимировать элементы на QQuickPaintedItem?

Хочу чтобы вся анимация и все отображение виджета было в с++ коде Если упрощенното виджет представляет собой 10 окружностей на которых расположены...

240