为什么我的程序在读取/写入文件时会删除最重要的数字?



我正在编写两个函数将 4 维向量保存到文件中,然后将向量读回文件中。

void saveLayer(string filename, int layer){
ofstream ofile(filename, ios::out | ios::trunc);
vector<vector<vector<vector<double>>>> oweights(layers[layer]->weights);
for(vector<vector<vector<double>>> stratg:oweights){
for(vector<vector<double>>layeri:stratg){
for(vector<double> neuronq:layeri){
for(double q:neuronq){
ofile<<setprecision(15)<<q;
}
}
}
}
vector<vector<vector<double>>> obiases=layers[layer]->biases;
for(vector<vector<double>>z:obiases){
for(vector<double> w:z){
for(double q:w){
ofile<<setprecision(15)<<q;
}
}
}
ofile.close();
}
void loadLayer(string filename, int nS, vector<int> layerStruct){
vector<vector<vector<vector<double>>>> newWeights;
vector<vector<vector<double>>> newBiases;
ifstream ifile(filename, ios::in);
for(int i=0; i<nS; i++){
vector<vector<vector<double>>> netWeights;
for(int z=1; z<layerStruct.size(); z++){
vector<vector<double>> layerWeights;
for(int x=0; x<layerStruct[z]; x++){
vector<double> neuronWeights;
for(int y=0; y<layerStruct[z-1]; y++){
double w;
ifile>>w;
neuronWeights.push_back(w);
}
layerWeights.push_back(neuronWeights);
}
netWeights.push_back(layerWeights);
}
newWeights.push_back(netWeights);
}
for(int i=0; i<nS; i++){
vector<vector<double>> netBiases;
for(int z=1; z<layerStruct.size(); z++){
vector<double> layerBiases;
for(int x=0; x<layerStruct[z]; x++){
double neuronBias;
ifile>>neuronBias;
layerBiases.push_back(neuronBias);
}
netBiases.push_back(layerBiases);
}
newBiases.push_back(netBiases);
}
layers[0]->numStrats=nS;
layers[0]->weights=newWeights;
layers[0]->biases=newBiases;
ifile.close();
}

我的问题是,当它应该写入或读取时,例如 1.2345,它会读取或写入 0.2345,从而删除最重要的数字。我不知道问题是否出在保存或加载功能上。我将非常感谢对为什么会这样的任何解释。

写入输出文件的数据之间没有分隔符。给定 1.234 和 5.678

ofile<<setprecision(15)<<q;

会将 1.2345.678 写入输出文件。你所有的号码都被混在一起,变成一个大团。回读时

ifile>>w;

不知道一个数字应该在哪里结束,下一个数字应该在哪里开始。结果,它会读取直到 if 找到一个不可能成为double一部分的字符。

例如,1.2345.678 将读取到 1.2345,在那里它找到第二个'.'。浮点数不能有 2 位小数(即使这个是double(,所以解析器停止,在流中留下 .678 以供下一次读取,并返回 1.2345。下次读取 .678 左右并返回为 0.678。

最重要的数字现在神秘地消失了,因为double只有 15 位数字,你可能不会注意到它被粘在以前的数字作为它的第 16 位数字。

可能的解决方案:在每个数字后写一个空格。

ofile<<setprecision(15)<<q << ' ';

最新更新