我目前正在尝试用二进制文件替换我的应用程序中的基于文本的文件。我只是做了一些早期测试,所以代码并不完全安全,但我遇到了数据问题。 当试图读出数据时,它会在开始返回错误结果之前大约一半。
我用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 << '\0';
fileStream << this->materialName << '\0';
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!87ihtCfnGXJJNn13iE6GIpeRhlhbabQHFfN88kr_BAk
(我先写下名字和材料,然后是实际的顶点列表前面的顶点数) 小问题 - 我应该分开这些双打还是一个接一个地添加它们?
答案 0 :(得分:2)
要在流中存储二进制数据,必须在打开时将std::ios_base::binary
添加到流的标记中。如果没有这个,流将以文本模式打开,并且可以进行行结束转换。
在Windows上,行结束转换意味着在每个0x0D
字节(用于换行的ASCII)之前插入一个字节0x0A
(用于回车的ASCII)。不用说,这会破坏二进制数据。