我需要编写一种文件格式,将数据写入文件并可以将其读回。
它应该能够以相当快的速度读回数据,这应该包括将大块数据传输到std::vector
(因为它们的存储总是连续实现)。
但是,在编写文件时,我不知道如何对整数和其他类型的对齐和大小强制执行约束。
应该怎么做?我在Q6600(x86)的buntu linux上使用gcc。
仅作为一个例子:
struct Vertex
{
float point [3];
float normal [3];
float texcoord [2];
}
稍后,数据存储在std::vector<Vertex>
中。我已经考虑过使用__attribute__
并对其进行打包/对齐,以便在不同平台上更加便携。
编辑: 我已经制定了规范,我打算使用它。最大的数据位是顶点和指数,因此它们将被视为大块,例如(较大规格的一部分): VertexGroup是一组共享特征的顶点。它们一次只能容纳一种材料,因此应该有许多材料包含在网格中。
<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
答案 0 :(得分:2)
这取决于您的编译器和平台。据我所知,没有办法以完全交叉编译和跨平台的方式强制执行此操作,而无需定义自己的大量宏。
但是,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调用加载整个文件。
答案 1 :(得分:1)
如果它只是POD(普通旧数据),没有指针,那么你可以只是fwrite和fread。当然,假设您绝对会在同一架构上回读与以前完全相同的格式。