二进制文件没有正确保存数据



我目前试图用二进制文件替换我的应用程序中的基于文本的文件。我只是做一些早期的测试,所以代码不是完全安全,但我有数据的问题。当试图读出数据时,在它开始返回错误结果之前,它得到了大约一半的数据。

我用c++创建文件,我的客户端应用程序是c#。我想问题出在我的c++(我用得不多)

现在的问题是我有一个名为DoubleVector3的结构体的向量它包含3个双精度

struct DoubleVector3 {
    double x, y, z;
    DoubleVector3(std::string line);
};

我目前正在将变量单独写入文件

void ObjElement::WriteToFile(std::string file) {
    std::ofstream fileStream;
    fileStream.open(file); //, ios::out | ios::binary);
    // ^^problem was this line. it should be 
    // fileStream.open(file, std::ios_base::out | std::ios_base::binary);
    fileStream << this->name << '';
    fileStream << this->materialName << '';
    int size = this->vertices.size();
    fileStream.write((char*)&size,sizeof(size));
    //i have another int written here
    for (int i=0; i<this->vertices.size(); i++) {
        fileStream.write((char*)&this->vertices[i].x, 8);
        fileStream.write((char*)&this->vertices[i].y, 8);
        fileStream.write((char*)&this->vertices[i].z, 8);
    }
    fileStream.close();
}

当我在c#中读取文件时,前6组3双精度都是正确的,但随后我开始得到0和负无穷大

我做什么明显错误在我的WriteToFile代码?

我有文件上传到mega如果有人需要看看它https://mega.co.nz/XEpHTSYR !87年ihtcfngxjjnn13ie6giperhlhbabqhffn88kr_bak

(我先写名称和材料,然后是顶点的数量,然后才是实际的顶点列表)小问题-我应该分隔这些双精度还是只是一个接一个地添加它们?

要在流中存储二进制数据,必须在打开流时将std::ios_base::binary添加到流的标志中。否则,流将以文本模式打开,并可能发生行结束转换。

在Windows上,行结束转换意味着在每个0x0A字节(换行ASCII)之前插入一个0x0D字节(换行ASCII)。不用说,这会破坏二进制数据。

相关内容

  • 没有找到相关文章

最新更新