繁体   English   中英

编写二进制文件的行为很奇怪

[英]Very strange behavior writing binary file

输出二进制数据时,我遇到了一个非常困惑的问题。 我正在编写一个采用ASCII文件格式并将值转换为二进制的模型转换器。 解析文件后,我将值写成二进制形式。 一切正常,直到某一点,然后事情变得怪异。

正在输出的数据块如下所示:

struct vertex_t
{
    glm::vec2 texcoord;
    unsigned short weight_index_start;
    unsigned char weight_count;
};

这是所讨论的二进制数据块,在#符号后带有人类可读的值。

00 00 80 3F # 1.000
AA AA AA 3E # 0.333
00 00       # 0
01          # 1

00 00 40 3F # 0.750
AA AA AA 3E # 0.333
01 00       # 1
01          # 1

00 00 40 3F # 0.750
00 00 00 00 # 0.000
02 00       # 2
01          # 1

...

一切看起来都很膨胀,直到第11个元素发生奇怪的事情……

00 00 00 3F # 0.500
AA AA AA 3E # 0.333
09 00       # 9
01          # 1

FE FF 7F 39 # 2.4x10^-4
AA AA 2A 3F # 0.666
0D          # 13 (why is this here?!)
0A 00       # 10
01          # 1

00 00 40 3F # 0.75
00 00 80 3F # 1.0
0B 00       # 11
01          # 1

如您所见,没有明显原因将0D写入结构的中间。 这是导出此结构的相关代码块:

for (const auto& vertex : mesh.vertices)
{
    ostream.write(reinterpret_cast<const char*>(&vertex.texcoord.x), sizeof(vertex.texcoord.x));
    ostream.write(reinterpret_cast<const char*>(&vertex.texcoord.y), sizeof(vertex.texcoord.y));
    ostream.write(reinterpret_cast<const char*>(&vertex.weight_index_start), sizeof(vertex.weight_index_start));
    ostream.write(reinterpret_cast<const char*>(&vertex.weight_count), sizeof(vertex.weight_count));
}

我不知道这怎么发生,但也许我错过了一些东西。 任何帮助,将不胜感激!

似乎您正在将回车符和换行符推入文件中。

OD : Carriage return
0A : NL line feed, New line

请参见http://www.asciitable.com/上的ASCII表

尝试使用ios :: binary参数打开文件

例:

fstream output("myfile.data", ios::out | ios::binary);

希望这可以帮助!

您没有显示如何编写数据。 但是,一般来说,如果输出格式不是文本格式,则必须以二进制模式打开文件; 看来,您好像是在Windows系统上,还没有这样做。 二进制值0x0A对应于'\\n' ,如果未以二进制模式打开文件,它将转换为依赖于系统的换行指示符-在Windows(可能还有大多数其他非Unix系统)下转换为两个字节序列0x0D,0x0A。

除非您的输出格式是文本,否则在读取和写入时都必须以二进制模式打开文件。 并且 (通常被遗忘)充满了“ C”语言环境; 否则,可能会有代码翻译。

RE您的更新,与写methodes:这样做,你保证以后能够读取任何输出。 (需要reinterpret_cast可以帮助您解决这一问题。)如果您只是将太大的数据集溢出到磁盘上,以便以后由同一过程重新读取,很好(前提是结构只包含完整的浮点数)和枚举类型)。 在所有其他情况下,您需要定义一种二进制格式(或使用已经定义的二进制格式,例如XDR),将输出格式化为该格式,然后在输入时进行解析。 (对于浮点数而言,以完全可移植的方式进行操作绝对不是一件容易的事。另一方面,大多数应用程序并不需要总体可移植性,并且如果二进制格式基于IEEE,并且所有目标系统都使用IEEE,您通常可以将浮点的位模式解释为适当大小的unsigned int,然后对其进行读写。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM