Когда я сериализую отдельную строку. Я могу использовать его в своем коде. Однако, когда я делаю то же самое с массивом, он просто дает мне случайные символы или целые числа. Я хочу знать, как я могу читать из архива, содержащего массив.
#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;
}
Я ожидал, что содержимое всего массива будет напечатано вместо случайных целых чисел и символов.
Этот
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;