我正在尝试编写一个简单的TGA图像文件保护程序作为C ++中的学习练习。我将我的代码基于一个示例TGA加载器,该加载器为头部声明了一个结构,然后使用fread()一次加载整个头文件。
我的程序现在不能正常工作,似乎有两个额外的字节写入文件。我打印了我的结构的大小,它的两个字节太大(20而不是正确的18)。稍微阅读后我认为问题与数据对齐和填充有关(我不太熟悉结构的存储方式)。
我的问题是什么是一个很好的解决方案?我想我可以逐字节地编写struct的组件,而不是使用fwrite()一次写入整个struct,这就是我现在要做的。我假设如果在加载标题时它起作用,它在编写时也会起作用。我的假设不正确吗?
答案 0 :(得分:4)
允许编译器经常将填充字节插入到结构中,以便字段在适当的内存地址上对齐。
最简单的解决方案是指示编译器“打包”结构,这意味着不插入任何填充字节。但是,这将使对结构的数据访问速度变慢,并且执行此操作的方式依赖于编译器。如果您想要便携和高效,唯一的方法就是单独编写字段。
答案 1 :(得分:1)
即使加载它也不起作用。你有几个选择:
使用特定于编译器的指令(#pragma packed等)强制您的结构为18个字节。
使用偏移量和指针来获取/设置缓冲区字段,使代码更易于编写。
答案 2 :(得分:0)
结构的元素通常以4字节边界排列。
如果结构中有短路或字符,则结构大于单个元素大小的总和。