如何将二进制数据写入文件以便快速读取?

时间:2009-06-19 16:18:49

标签: c++ linux file gcc binary

我需要编写一种文件格式,将数据写入文件并可以将其读回。

它应该能够以相当快的速度读回数据,这应该包括将大块数据传输到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

2 个答案:

答案 0 :(得分:2)

这取决于您的编译器和平台。据我所知,没有办法以完全交叉编译和跨平台的方式强制执行此操作,而无需定义自己的大量宏。

但是,VC ++和GCC(两个)都支持#pragma pack指令,这将允许您定义结构的对齐和打包。请参阅http://msdn.microsoft.com/en-us/library/2e70t5y1.aspxhttp://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

考虑到这一点,您可以使用#pragma pack来定义结构的对齐方式,然后使用fread()或类似的方法来简单地将文件中的字节从文件中移到内存中。您可能希望在列表前面加上列表长度,以便您可以一次为整个列表分配内存,然后使用单个I / O调用加载整个文件。

答案 1 :(得分:1)

如果它只是POD(普通旧数据),没有指针,那么你可以只是fwrite和fread。当然,假设您绝对会在同一架构上回读与以前完全相同的格式。

考虑boost serialization