将struct写入文件时会写入太多字节

时间:2010-07-19 20:58:13

标签: c++ binary struct writing

我正在尝试编写一个简单的TGA图像文件保护程序作为C ++中的学习练习。我将我的代码基于一个示例TGA加载器,该加载器为头部声明了一个结构,然后使用fread()一次加载整个头文件。

我的程序现在不能正常工作,似乎有两个额外的字节写入文件。我打印了我的结构的大小,它的两个字节太大(20而不是正确的18)。稍微阅读后我认为问题与数据对齐和填充有关(我不太熟悉结构的存储方式)。

我的问题是什么是一个很好的解决方案?我想我可以逐字节地编写struct的组件,而不是使用fwrite()一次写入整个struct,这就是我现在要做的。我假设如果在加载标题时它起作用,它在编写时也会起作用。我的假设不正确吗?

3 个答案:

答案 0 :(得分:4)

允许编译器经常将填充字节插入到结构中,以便字段在适当的内存地址上对齐。

最简单的解决方案是指示编译器“打包”结构,这意味着不插入任何填充字节。但是,这将使对结构的数据访问速度变慢,并且执行此操作的方式依赖于编译器。如果您想要便携和高效,唯一的方法就是单独编写字段。

答案 1 :(得分:1)

即使加载它也不起作用。你有几个选择:

  1. 使用特定于编译器的指令(#pragma packed等)强制您的结构为18个字节。

  2. 使用偏移量和指针来获取/设置缓冲区字段,使代码更易于编写。

答案 2 :(得分:0)

结构的元素通常以4字节边界排列。

如果结构中有短路或字符,则结构大于单个元素大小的总和。