我正在尝试将三重向量写入文件,然后能够读回数据结构。当我尝试在保存文件后重新读取文件时,前五十个值出现正确,但其余值都是垃圾。如果有人能帮助我,我真的很感激。非常感谢!
文件声明:
fstream memory_file("C:\\Users\\Amichai\\Pictures\\output.txt", ios::in | ios::out);
保存功能:
void save_training_data(fstream &memory_file, vector<vector<vector<long double> > > &training_data)
{
int sizeI = training_data.size();
memory_file.write((const char *)&sizeI, sizeof(int));
for (int i=0; i < sizeI; i++)
{
int sizeJ = training_data[i].size();
memory_file.write((const char *)&sizeJ, sizeof(int));
for (int j=0; j < sizeJ; j++)
{
int sizeK = training_data[i][j].size();
memory_file.write((const char *)&sizeK, sizeof(int));
for (int k = 0; k < sizeK; k++)
{
int temp;
temp = (int)training_data[i][j][k];
memory_file.write((const char *)&temp, sizeof(int));
}
}
}
}
阅读功能:
void upload_memory(fstream &memory_file, vector<vector<vector<long double> > > &training_data)
{
memory_file.seekg(ios::beg);
int temp=0;
int sizeK, sizeJ, sizeI;
memory_file.read((char*)&sizeI, sizeof(int));
training_data.resize(sizeI);
for (int i=0; i < sizeI; i++)
{
memory_file.read((char*)&sizeJ, sizeof(int));
training_data[i].resize(sizeJ);
for (int j=0; j < sizeJ; j++)
{
memory_file.read((char*)&sizeK, sizeof(int));
training_data[i][j].resize(sizeK);
for (int k = 0; k < sizeK; k++)
{
memory_file.read((char*)&temp, sizeof(int));
training_data[i][j][k]=temp;
}
}
}
}
答案 0 :(得分:3)
由于您正在编写二进制数据(并且显然在Windows下工作),因此在打开fstream时确实需要指定ios :: binary。
答案 1 :(得分:0)
问题在于您将二进制形式的数值写入流处理器解释为文本的文件中。要么使用二进制文件(使用ios :: binary),要么在写入文件之前将数字转换为字符串。
答案 2 :(得分:0)
在www.booost.org查看Boost.Serialization库。它知道如何从文件读取和写入STL集合。不过,我不知道它是否可以处理嵌套容器。
您可能还想将Boost.Multiarray用于三维数据。如果您要对数据进行矩阵数学运算,那么您可能需要使用Boost.uBlas。
答案 3 :(得分:0)
正如其他答案建议使用“ios :: in | ios :: out | ios :: binary”而不是“ios :: in | ios :: out”这是正确的,但我记得读过C ++流具有二进制选项的规范根本不是为二进制文件设计的。如果使用“ios :: binary”没有帮助,则需要使用stdio.h的C函数fopen(),fread(),fwrite()和fclose(),或者,如另一个用户所建议的那样,使用Boost :: Serilization库。