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