我需要编写一种文件格式,将数据写入文件并可以将其读回。
它应该能够相当快地读回数据,这应该涉及将一大块数据传输到 std::vector
(因为它们的存储始终是连续实现的)。
但是,在编写文件时,我不知道如何强制限制整数和其他类型的对齐和大小。
这应该如何完成?我在 Q6600 (x86) 上的 Buntu linux 上使用 gcc。
举个例子:
struct Vertex
{
float point [3];
float normal [3];
float texcoord [2];
}
随后,数据存储在 std::vector<Vertex>
中。我考虑过使用__attribute__
并打包/对齐它,以便它在不同平台上更便携。
编辑: 我已经制定了规范,并且打算使用它。最大的数据位是顶点和索引,因此它们将作为大块读取,例如(较大规范的一部分): VertexGroup 是一组共享特征的顶点。它们一次只能容纳一种 Material ,因此网格中应该包含许多 Material 。
<uint> thisid # Of this VertexGroup
<string> name
<uint> materialId # A material
<uint> vertexCount
for (vetexCount):
<3xfloat> point
<3xfloat> normal
<2xfloat> texcoord
<uint> triangleCount
for (triangleCount):
<3xuint> indices
最佳答案
这取决于您的编译器和平台。据我所知,如果不定义大量自己的宏,就无法以完全跨编译器和跨平台的方式强制执行此操作。
但是,VC++ 和 GCC(两大巨头)都支持 #pragma pack
指令,该指令允许您定义结构的对齐和打包。请参阅http://msdn.microsoft.com/en-us/library/2e70t5y1.aspx或http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html .
考虑到这一点,您可以使用#pragma pack
来定义结构的对齐方式,然后使用fread()
或类似的方法来简单地从文件中传输字节内存。您可能需要在列表前添加列表长度前缀,以便可以一次性为整个列表分配内存,然后使用单个 I/O 调用加载整个文件。
关于c++ - 如何将二进制数据写入文件以便可以快速读回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1018830/