读/写二进制文件返回0xCCCCCCCC

时间:2017-09-06 14:17:41

标签: c++ file-io binaryfiles binary-data

我有一个脚本将类信息转储到二进制文件中,然后是另一个检索它的脚本。

由于二进制文件只接受字符,我写了三个函数来读写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);
}

提前致谢!

1 个答案:

答案 0 :(得分:2)

您必须检查打开,读取和写入操作的结果。

你需要打开文件(用于读写)作为二进制文件。

相关问题