Reading/writing 二进制文件 returns 0xCCCCCCCC
Reading/writing binary file returns 0xCCCCCCCC
我有一个脚本可以将 class 信息转储到一个二进制文件中,然后另一个脚本可以检索它。
由于二进制文件只接受字符,我写了三个函数来读取和写入 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;
}
我会把 class load/save 脚本放在 post 的末尾,但我认为如果没有其余的class 信息。
无论如何,文件似乎已正确保存。它具有正确的大小,并且在我加载它时所有数据都匹配。但是,在加载过程的某个时刻,file.read() 函数开始每次都返回 0xCCCCCCCC。这在我看来像是一个读取错误,但我不确定原因或如何更正它。由于文件大小正确,而且我没有触及 seekg() 函数,因此它似乎不太可能过早到达文件末尾。我只能假设这是我的 read/write 方法的问题,因为我确实用有限的知识将它破解了。但是,如果是这样,为什么它读取所有数据到某个点没有问题?
错误开始发生在每个 运行 的随机点。这可能与所有 class 数据都是随机生成的事实有关,也可能无关。
有人有这方面的经验吗?我什至不确定此时如何继续调试它。
无论如何,这里有 load/save 个函数:
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);
}
提前致谢!
您必须检查打开、读取、写入操作的结果。
并且您需要以二进制形式打开文件(用于读写)。
我有一个脚本可以将 class 信息转储到一个二进制文件中,然后另一个脚本可以检索它。
由于二进制文件只接受字符,我写了三个函数来读取和写入 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;
}
我会把 class load/save 脚本放在 post 的末尾,但我认为如果没有其余的class 信息。
无论如何,文件似乎已正确保存。它具有正确的大小,并且在我加载它时所有数据都匹配。但是,在加载过程的某个时刻,file.read() 函数开始每次都返回 0xCCCCCCCC。这在我看来像是一个读取错误,但我不确定原因或如何更正它。由于文件大小正确,而且我没有触及 seekg() 函数,因此它似乎不太可能过早到达文件末尾。我只能假设这是我的 read/write 方法的问题,因为我确实用有限的知识将它破解了。但是,如果是这样,为什么它读取所有数据到某个点没有问题?
错误开始发生在每个 运行 的随机点。这可能与所有 class 数据都是随机生成的事实有关,也可能无关。
有人有这方面的经验吗?我什至不确定此时如何继续调试它。
无论如何,这里有 load/save 个函数:
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);
}
提前致谢!
您必须检查打开、读取、写入操作的结果。
并且您需要以二进制形式打开文件(用于读写)。