2010-07-19 46 views
2

我想写一个简单的TGA图像文件保护程序作为学习练习在C++中。我将我的代码放在一个示例TGA加载器上,该加载器为头部声明结构,然后使用fread()一次加载整个头部。当写入结构到一个文件太多的字节被写入

我的程序现在不能正常工作,好像有两个额外的字节被写入文件。我打印sizeof我的结构,它的两个字节太大(20而不是正确的18)。经过一些阅读后,我认为这个问题与数据对齐和填充有关(我不太了解结构如何存储)。

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

回答

4

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

最简单的解决方法是指示编译器“打包”结构,这意味着不要插入任何填充字节。然而,这会使数据访问结构变得更慢,并且这样做的手段依赖于编译器。如果您想要便携且高效,唯一的办法就是单独编写字段。

1

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

  1. 使用编译器具体的指示(包装的#pragma等),迫使你的结构是18个字节。

  2. 通过使用偏移量和指针来获取/设置缓冲区字段,使代码更具可移植性。

0

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

如果您的结构中有短裤或字符,则该结构大于各个元素大小的总和。