gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:08:26 25 4
gpt4 key购买 nike

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

它应该能够相当快地读回数据,这应该涉及将一大块数据 block 传送到 std::vector 中。 (因为它们的存储总是连续实现的)。

但是,在编写文件时,我不知道如何对 int 和其他类型的对齐和大小施加约束。

这应该怎么做?我在 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.aspxhttp://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html .

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

关于c++ - 如何将二进制数据写入文件以便可以快速读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1018830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com