Как читать из сериализованного массива?

Когда я сериализую отдельную строку. Я могу использовать его в своем коде. Однако, когда я делаю то же самое с массивом, он просто дает мне случайные символы или целые числа. Я хочу знать, как я могу читать из архива, содержащего массив.

#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/string.hpp>


using namespace std;

void CWordSave()
{

    ofstream file("archive.txt");
    boost::archive::text_oarchive oa(file);
    string Cwords[] = { "Oak", "Tree", "Dog", "Cat", "Human", "Food", "Computer", "Inteligent", "Special", "Unique" };

    oa << Cwords;
}

void CWordLoad(int &i)
{

    ifstream file("archive.txt");
    boost::archive::text_iarchive ia(file);
    string Cwords;
    ia >> Cwords;


        cout << Cwords[i] << endl;


}
int main()
{
CWordSave();

for (int i = 0; i < 10; ++i)
    {

        CWordLoad(i);

    }

return 0;
}

Я ожидал, что содержимое всего массива будет напечатано вместо случайных целых чисел и символов.

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот

string Cwords[] = { "Oak", "Tree", "Dog",

представляет собой массив, и

oa << Cwords;

вы сериализовали массив.

Этот

string Cwords;

является одним из экземпляров string. С помощью ia >> Cwords; вы десериализовали один строковый объект, а не массив.

В cout << Cwords[i] << endl; вы вызываете string::operator[] и получаете доступ к отдельному символу строки вместо того, чтобы печатать экземпляры всей строки.

При десериализации вам нужно создать массив, и вы должны убедиться, что его размера достаточно для хранения данных:

string Cwords[10];
ia >> Cwords;
cout << Cwords[i] << endl; // now, this accesses instance of string from array

если вы хотите, чтобы ваш код был более гибким, возможно, вам следует использовать вектор строки?

#include <boost/serialization/vector.hpp>
...
    vector<string> Cwords = { "Oak", "Tree", "Dog", "Cat", "Human", "Food", "Computer", "Inteligent", "Special", "Unique" };
    oa << Cwords;
...
    vector<string> Cwords;
    ia >> Cwords;

    if (i < Cwords.size())
        cout << Cwords[i] << endl;

Другие вопросы по теме