Вопрос Сохранение данных в файл

Searching for myself
Пользователь
Статус
Оффлайн
Регистрация
29 Сен 2021
Сообщения
212
Реакции[?]
69
Поинты[?]
11K
Сохраняю масив с аккаунтами в файл
1654235802104.png
1654235865144.png
1654235920101.png
Определение m_vecAccountData std::vector< AccountData_t > m_vecAccountData = { };
Пожалуйста, авторизуйтесь для просмотра ссылки.
На выходе получаю это:
Пожалуйста, авторизуйтесь для просмотра ссылки.

В чем может быть проблема?
 
midnight.im
Администратор
Статус
Оффлайн
Регистрация
1 Июл 2015
Сообщения
1,650
Реакции[?]
2,173
Поинты[?]
162K
А в чем проблема собственно? Или ты думаешь что std::vector<AccountData_t> автоматом сериализуется в json если использовать функцию записи?
 
Searching for myself
Пользователь
Статус
Оффлайн
Регистрация
29 Сен 2021
Сообщения
212
Реакции[?]
69
Поинты[?]
11K
А в чем проблема собственно? Или ты думаешь что std::vector<AccountData_t> автоматом сериализуется в json если использовать функцию записи?
Возможна ли реализация без библиотеки json? Хочу сделать максимально просто

Пожалуйста, авторизуйтесь для просмотра ссылки.
сделано так же как и у меня, и оно работает
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
22 Сен 2018
Сообщения
52
Реакции[?]
11
Поинты[?]
1K
Участник
Статус
Оффлайн
Регистрация
15 Янв 2021
Сообщения
492
Реакции[?]
289
Поинты[?]
79K
Так ты же тупо объект AccountData_t кастуешь в строку и всё. Твой &Account в цикле - ссылка, потому и получаешь такой набор символов. Сделай для структуры AccountData_t функцию, которая будет возвращать все сведения об аккаунте ( перегрузку для ofstream вроде нельзя сделать, так что придётся делать функцию ).
 
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Если проблема в записи кириллицы, то попробуйте добавить setlocale(LC_ALL, "rus");, а также сохраните текстовый файл в кодировке ANSI.
 
Searching for myself
Пользователь
Статус
Оффлайн
Регистрация
29 Сен 2021
Сообщения
212
Реакции[?]
69
Поинты[?]
11K
Так ты же тупо объект AccountData_t кастуешь в строку и всё. Твой &Account в цикле - ссылка, потому и получаешь такой набор символов. Сделай для структуры AccountData_t функцию, которая будет возвращать все сведения об аккаунте ( перегрузку для ofstream вроде нельзя сделать, так что придётся делать функцию ).
Я тупой, спасибо, вечером проверю
 
Начинающий
Статус
Оффлайн
Регистрация
22 Сен 2018
Сообщения
52
Реакции[?]
11
Поинты[?]
1K
Я тупой, спасибо, вечером проверю
Example:
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <filesystem>

enum : uint16_t { ECustomer, EAdmin };

typedef struct _ACCOUNT_DATA {
    // Fields
    const std::string m_sLogin, m_sPassword;
    uint16_t m_uiPrivilege;

    // Constructors
    _ACCOUNT_DATA( const std::string lsLogin, const std::string lsPassword, const uint16_t luiPrivilege ) : m_sLogin( lsLogin ), m_sPassword( lsPassword ), m_uiPrivilege( luiPrivilege ) {}

} ACCOUNT_DATA, *PACCOUNT_DATA;

std::vector<ACCOUNT_DATA> &AddAccount( std::string lsLogin, std::string lsPassword, uint16_t luiPrivilege ) {
    static std::vector<ACCOUNT_DATA> g_vAccounts = std::vector<ACCOUNT_DATA>();

    ACCOUNT_DATA account = ACCOUNT_DATA( lsLogin, lsPassword, luiPrivilege );
    g_vAccounts.push_back( account );

    return g_vAccounts;
}

std::ofstream &operator<<( std::ofstream &ofs, const _ACCOUNT_DATA &p ) {
    ofs << p.m_sLogin << "|" << p.m_sPassword << "|" << p.m_uiPrivilege;
    return ofs;
}

BOOL SaveAccounts( std::vector<ACCOUNT_DATA> lvAccounts ) {
    std::ofstream file( "accounts.data", std::ios::out | std::ios::trunc );

    if ( !file.is_open() ) {
        std::cout << __FUNCTION__ << ": Failed to open file." << std::endl;
        return false;
    }

    if ( lvAccounts.size() > 1 )
        for ( size_t i = 0; i < lvAccounts.size() - 1; i++ )
            file << lvAccounts[i] << std::endl;
    file << lvAccounts[lvAccounts.size() - 1];

    file.close();

    return true;
}

int main() {
    // Russian encoding
    SetConsoleCP( 1251 );
    SetConsoleOutputCP( 1251 );

    std::string sLogin, sPassword;

    std::cout << "Write your login: ";
    std::cin >> sLogin;

    std::cout << "Write your password: ";
    std::cin >> sPassword;

    // Test
    AddAccount( "Example", "Vector", ECustomer );
    AddAccount( "Im", "User", EAdmin );
    AddAccount( "Log", "Pass", ECustomer );

    auto vAccounts = AddAccount( sLogin, sPassword, EAdmin );
    SaveAccounts( vAccounts );

    // Pause app
    system( "pause" );

    return 0;
}
 
Последнее редактирование:
midnight.im
Администратор
Статус
Оффлайн
Регистрация
1 Июл 2015
Сообщения
1,650
Реакции[?]
2,173
Поинты[?]
162K
у тебя динамическое количество данных. я бы лучше написал какой-то парсер и тд. с учетом того что у тебя не статик размер строк а динамик. ну или просто заюзай жсон

а если быть точнее. у тебя std::string находится в структуре. просто так ты его не сохранишь. тк в std::string лежит поинтер на данные и ещё пару параметров. их-за чего при сохранении ты сохранишь указатель на строку. а не саму строку.
 
Последнее редактирование:
Сверху Снизу