C++ 读/写二进制文件返回0xCCCC

C++ 读/写二进制文件返回0xCCCC,c++,file-io,binaryfiles,binary-data,C++,File Io,Binaryfiles,Binary Data,我有一个脚本将类信息转储到二进制文件中,然后另一个脚本检索它 由于二进制文件只接受字符,所以我编写了三个函数来读取和写入短整数、整数和浮点。我一直在用它们做实验,这样它们就不会过载,但它们看起来都是这样的: void writeInt(ofstream& file, int val) { file.write(reinterpret_cast<char *>(&val), sizeof(val)); } int readInt(ifstream& fi

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

由于二进制文件只接受字符,所以我编写了三个函数来读取和写入短整数、整数和浮点。我一直在用它们做实验,这样它们就不会过载,但它们看起来都是这样的:

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;
}
void writeInt(流和文件,int-val){
write(reinterpret_cast(&val),sizeof(val));
}
int readInt(ifstream和file){
int-val;
read(reinterpret_cast(&val),sizeof(val));
返回val;
}
我将把类装入/保存脚本放在文章的末尾,但是如果没有其余的类信息,我认为它没有多大意义

无论如何,文件似乎保存得很好。它的大小正确,加载时所有数据都匹配。但是,在加载过程中的某个时刻,file.read()函数开始每次返回0xCCCC。在我看来,这像是一个读取错误,但我不知道为什么,或者如何更正它。由于文件大小正确,而且我没有使用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);
}
void saveToFile(字符串文件名){
流数据文件(fileName.c_str());
writeInt(数据文件、inputSize);
writeInt(数据文件,全尺寸);
writeInt(数据文件、输出大小);
//跳过输入节点-无需为其保存数据。
对于(inti=inputSize;i

提前谢谢

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


您需要以二进制文件的形式打开文件(用于读写)。

在读取时,您从不检查流状态。那太糟糕了。。。。或者写作。或者那个文件被打开了。。。您还想将它们(用于读写)作为二进制文件打开什么是
节点
read
做什么?请提供一个模板,您应该利用函数重载,并使用一个函数名来编写int、short等。您也可以使用模板。在你尝试一个复杂的类之前,试着写和读一个
int
。小步走。