現在私はアドベンチャーゲームを作成しており、
テキストメッセージのバックログをXORをかけて簡単な暗号化をし
外部ファイルにバイナリで書き出した後、読み込み復号化したいと思っています。
しかし、復号化の際「\t」「\n」をうまく判定することができていないのか
表示するところまでたどり着けません。
書き出したコードは以下の通りです。
OSはWindows10、VS2015を使用しています。
お知恵をお貸しいただければと思います。
よろしくお願いいたします。
#define CIPHER_KEY 12345
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
vector<vector<string>> backLog;
vector<string> backLogStr;
backLogStr.push_back("あいうえお");
backLogStr.push_back("かきくけこ");
backLogStr.push_back("さしすせそ");
backLog.push_back(backLogStr);
backLogStr.clear();
backLogStr.push_back("たちつてと");
backLogStr.push_back("なにぬねの");
backLog.push_back(backLogStr);
for (int i = 0; i < (int)backLog.size(); i++)
{
for (int j = 0; j < (int)backLog[i].size(); j++)
{
if (j != 0)
{
cout << '\t';
}
cout << backLog[i][j];
}
cout << '\n'<< endl;
}
// XORをかけて書き出し
ofstream fileSave("backLog.dat", ios::binary);
for (int i = 0; i < (int)backLog.size(); i++)
{
for (int j = 0; j < (int)backLog[i].size(); j++)
{
if (j != 0)
{
fileSave << ('\t'^ CIPHER_KEY);
}
string str = backLog[i][j];
char* cstr = new char[str.size() + 1];
char_traits<char>::copy(cstr, str.c_str(), str.size() + 1);
char byteStr = '\0';
string outStr = "\0";
for (int k = 0; k < (int)str.size(); k++)
{
outStr += cstr[k] ^ CIPHER_KEY;
if (byteStr == '\\')
{
outStr += '\\';
}
}
fileSave << outStr;
delete cstr;
}
fileSave << ('\n'^ CIPHER_KEY);
}
backLogStr.clear();
backLog.clear();
// 読み込み
ifstream ifs("backLog.dat", ios::binary);
if (ifs)
{
char byte = '\0';
string loadString = "\0";
vector<string> vs;
while (!ifs.eof())
{
ifs.read((char*)&byte, sizeof(char));
byte = byte ^ CIPHER_KEY;
// 現状どちらの条件にも引っかからない
if (byte == '\t')
{
backLog.push_back(vs);
vs.clear();
}
else if (byte == '\n')
{
vs.push_back(loadString);
loadString = "\0";
}
else
{
loadString += byte;
}
}
// 表示
for (int i = 0; i < (int)backLog.size(); i++)
{
for (int j = 0; j < (int)backLog[i].size(); j++)
{
cout << backLog[i][j];
}
}
}
return 0;
}