我正在尝试通过编写C ++应用程序与开源程序进行交互,这些应用程序可以读取 - 修改 - 写入该程序使用的二进制文件格式。好处是程序是开源的,坏的是它的二进制文件不遵循任何“标准”,只是它自己的阅读和保存方式。
这就是程序在文件中保存bool
变量的方式:
memset(keyword, 0, 100);
sprintf(keyword, "drawbox");
fout.write((char*)keyword, strlen(keyword)+1);
fout.write((char*)&m_drawBox, sizeof(bool));
这就是它如何阅读bool
:
else if (strcmp(keyword, "drawbox") == 0)
fin.read((char*)&m_drawBox, sizeof(bool));
这部分工作正常,我可以解析它。我也可以像整数一样解析单个变量。
我的问题在于它保存向量或四元数时的部分。
保存向量position
:
memset(keyword, 0, 100);
sprintf(keyword, "position");
fout.write((char*)keyword, strlen(keyword)+1);
fout.write((char*)&m_position, 3*sizeof(float));
阅读向量position
:
fin.read((char*)&m_volMax, 3*sizeof(float));
else if (strcmp(keyword, "position") == 0)
所以这些都是原始源代码的片段。在我的代码中,如果我尝试使用以下内容,我就会遇到问题。
以下是我的代码中的部分:
struct Vec
{
float x,y,z;
};
Vec m_position;
else if (strcmp(keyword, "position") == 0)
fin.read((char*) &kf.m_position, 3*sizeof(float));
但这不起作用。以下是我从示例文件中获取的值:
m_position x = -1.07374e+008
m_position y = -1.07374e+008
m_position z = -1.07374e+008
所以不知何故,这些值不会被分成x,y,z,它们会被重复到相同的x,y,z部分!
有人可以帮我解决导致此问题的原因吗?实际上这种保存文件的方式是什么?使用(* char)?
将内存直接写入文件是不是一个奇怪的想法这是与原始文件中的3 *浮点向量m_position对应的二进制数据。
45 01 67 44 9E 57 19 C3 48 14 09 45
答案 0 :(得分:6)
m_position x = -1.07374e + 008
如果你看看调试器的原始内存视图的值,你会看到float的字节值是0xcccccccc。这是一个特殊值,MSVC编译器使用它来初始化Debug构建中的变量。
换句话说,你的m_position变量从未被分配过。
缺少更多信息,至少有一个简单的解释:fin.read()调用没有读取任何内容。我必须假设你的代码不包含任何错误检查,这是一个常见的遗漏。
答案 1 :(得分:0)
Actualy几个星期前我做了二进制文件解析,得到了一个与你的结果相同的丑陋bug。问题是,当我将二进制数据写入文件时,我忘了关闭文件。因此,读取数据并将其解析回ascii我得到了与您相同的结果。
我不是说你的情况就是这样,但检查没有伤害,是吗?