我有一个脚本将类信息转储到二进制文件中,然后是另一个检索它的脚本。
由于二进制文件只接受字符,我写了三个函数来读写Short Ints,Ints和Floats。我一直在试验他们,所以他们没有正确超载,但他们都看起来像这样:
void writeInt(ofstream& file, int val) {
file.write(reinterpret_cast<char *>(&val), sizeof(val));
}
int readInt(ifstream& file) {
int val;
file.read(reinterpret_cast<char *>(&val), sizeof(val));
return val;
}
我会将课程加载/保存脚本放在帖子的末尾,但是如果没有剩下的课程信息,我就不会认为它太有意义了。
无论如何,似乎文件得到了妥善保存。它具有正确的大小,并且在加载它时所有数据都匹配。但是,在加载过程中的某个时刻,file.read()函数每次都开始返回0xCCCCCCCC。这看起来像是一个读错误,但我不确定为什么,或者如何纠正它。由于文件大小正确,并且我没有触及seekg()函数,因此它似乎不太可能过早地到达文件末尾。我只能认为这是我的读/写方法的一个问题,因为我用有限的知识一起破解它。但是,如果是这种情况,为什么它会在没有问题的情况下读取所有数据?
错误在每次运行的随机点开始发生。这可能与所有类数据是随机生成的事实有关,也可能与之无关。
有没有人有这方面的经验?我现在还不确定如何继续调试它。
无论如何,这里是加载/保存功能:
void saveToFile(string fileName) {
ofstream dataFile(fileName.c_str());
writeInt(dataFile, inputSize);
writeInt(dataFile, fullSize);
writeInt(dataFile, outputSize);
// Skips input nodes - no data needs to be saved for them.
for (int i = inputSize; i < fullSize; i++) { // Saves each node after inputSize
writeShortInt(dataFile, nodes[i].size);
writeShortInt(dataFile, nodes[i].skip);
writeFloat(dataFile, nodes[i].value);
//vector<int> connects;
//vector<float> weights;
for (int j = 0; j < nodes[i].size; j++) {
writeInt(dataFile, nodes[i].connects[j]);
writeFloat(dataFile, nodes[i].weights[j]);
}
}
read(500);
}
void loadFromFile(string fileName) {
ifstream dataFile(fileName.c_str());
inputSize = readInt(dataFile);
fullSize = readInt(dataFile);
outputSize = readInt(dataFile);
nodes.resize(fullSize);
for (int i = 0; i < inputSize; i++) {
nodes[i].setSize(0); // Sets input nodes
}
for (int i = inputSize; i < fullSize; i++) { // Loads each node after inputSize
int s = readShortInt(dataFile);
nodes[i].setSize(s);
nodes[i].skip = readShortInt(dataFile);
nodes[i].value = readFloat(dataFile);
//vector<int> connects;
//vector<float> weights;
for (int j = 0; j < nodes[i].size; j++) {
nodes[i].connects[j] = readInt(dataFile); //Error occurs in a random instance of this call of readInt().
nodes[i].weights[j] = readFloat(dataFile);
}
read(i); //Outputs class data to console
}
read(500);
}
提前致谢!
答案 0 :(得分:2)
您必须检查打开,读取和写入操作的结果。
你需要打开文件(用于读写)作为二进制文件。