私は個人的なシリアル化プロセスに取り組んできましたが、保存/ロード後に復号化されたベクトルを取り戻すのに行き詰まりました。データの保存と読み込みは問題なく行われますが、ベクターインベントリは遷移中にその定義を失うため、再作成する必要があります。これにより、プログラムの後半でデータを使用できなくなります。以下のコードスニペットは、暗号化/復号化する方法を示しています。
struct bin{
map<string, int>::iterator it;
int modify_string;
vector<string> uncrypt_vec;
map<string, int> encryption;
void set_up_code(){
string alphabet[] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
int letter_num=1;
for(int i = 0; i < 27; ++i){
string letter = alphabet[i]; //Assign each letter to a number
encryption.insert(pair<string,int>(letter,letter_num));
letter_num++;
}
encryption.insert(pair<string,int>(" ", -1));
}
int encrypt_vector(vector<string>& crypt){
stringstream ssv;
for(unsigned int i = 0; i < crypt.size(); ++i){
string word = crypt[i]; //Grab each string
int mod_word[word.size()];
for(unsigned int x = 0; x < word.size(); ++x){
stringstream ssl;
string letter;
char let = word[x]; //Convert each letter of the string into an integer
ssl << let;
ssl >> letter;
int num = encryption[letter];
mod_word[x] = num;
}
mod_word[word.size()] = 0; //Include a zero for each word
copy(mod_word, mod_word+word.size()+1, ostream_iterator<int>(ssv));
}
ssv >> modify_string; //Put into int modify_string and return
return modify_string;
}
vector<string> decrypt_vector(int& uncrypt){
string num;
stringstream ssn;
ssn << uncrypt; //Store the numbers in a string
ssn >> num;
string mod_word;
string word;
for(unsigned int i=0;i<num.size();++i){
int number;
char check_num = num[i];
stringstream ssctn;
ssctn << check_num; //Kinda stupid way of doing it
ssctn >> number; //Pulls int from num[i], then checks it against 0
if(number==0){ //If break point
uncrypt_vec.push_back(mod_word); //Push back the word
mod_word.clear();
}
int letter;
stringstream sscn;
char let = num[i];
sscn << let; //Pull each letter from uncrypt, change back to letter based on encryption
sscn >> letter;
for(it = encryption.begin(); it != encryption.end(); ++it){
if(it->second == letter){
mod_word.append(it->first);
break;
}
}
}
cout << "Done" << endl;
return uncrypt_vec;
}
}binary;
struct player{
vector<string> inventory;
int inventory_en; //en for encrypted
void save(){
inventory_en = binary.encrypt_vector(inventory);
}
void load(){
vector<string> inventory; //Must recreate, type is lost otherwise, crashes
inventory = binary.decrypt_vector(inventory_en);
vector<string>::iterator i;
for(i=inventory.begin();i!=inventory.end();++i){
cout << *i << endl; //Prints correctly here
}
}
}character;
int main(){
character.inventory.push_back("abc");
character.inventory.push_back("edf");
binary.set_up_code();
character.save();
character.load();
}
後でcharacter.inventoryを印刷しようとすると、クラッシュします。また、character.inventoryをcharacter.load()関数の文字列として定義しないと、クラッシュします。では、プログラムの後半で(構造体から)呼び出すことができるベクトルとして定義されたcharacter.inventoryを取得するにはどうすればよいですか?
私は同じ方法を使用してファイルにデータを書き込みoutput_file.write((char*)&structObj, sizeof(structObj));
、読み取ります(したがって、暗号化/復号化する必要があり、この方法で文字列を保存することはできません)。
そして、私のためにそれをするために私を図書館に案内しないでください。