2009-06-19 150 views
2

我需要編寫一個文件格式來將數據寫入文件並且可以讀取它。如何將二進制數據寫入文件以便快速讀取?

它應該能夠以相當快的速度讀取數據,這應該涉及將大塊數據分塊寫入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

這將取決於您的編譯器和平臺。據我所知,沒有辦法以完全交叉編譯器和跨平臺的方式執行此操作,而無需定義自己的大量宏。

但是,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

如果它只是POD(普通的舊數據),沒有指針,那麼你可以用fwrite和fread。這當然假設你完全會在同一個體系結構上讀回與以前完全相同的格式。

考慮boost serialization

+0

增強序列化有多快?這可以節省很多麻煩,看看它的工作原理會很有趣。我想知道它是如何處理數組的,並且它的速度有多快(文件中有100萬個頂點,因此不會將整個數據塊移到內存中)。 – solinent 2009-06-19 17:06:12