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

标签 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 是一组共享特征的顶点。它们一次只能容纳一种 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()或类似的方法来简单地从文件中传输字节内存。您可能需要在列表前添加列表长度前缀,以便可以一次性为整个列表分配内存,然后使用单个 I/O 调用加载整个文件。

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

相关文章:

c++ - GLSL C++ glVertexAttribPointer & glDrawElements 返回 GL_INVALID_OPERATION

java - 在将 Sockets 与 NIO 结合使用时防止内存使用率过高

c++ - 在多核 MacOSX 上,以下 c++ 代码是线程安全的吗?

linux - Jenkins 作业能否根据代理操作系统有条件地执行 shell 或 Windows 命令?

linux - 如何在 bash 脚本执行期间更改用户并继续使用新用户运行命令?

php - 以编程方式为视频添加水印

Java 使用外部文本文件中的数据

java - 如何在 Android 应用程序中保存天文钟耗时

c++ - 使用UDP进行写入和读取之间的长时间延迟

c++ - 收到错误LNK2019和错误LNK1120