繁体   English   中英

将struct写入文件时,写入了太多字节

[英]When writing struct to a file too many bytes are written

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

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

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

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

最简单的解决方案是指示编译器“打包”该结构,这意味着不要插入任何填充字节。 但是,这将使对结构的数据访问变慢,并且实现该方法的方式取决于编译器。 如果您想变得可移植且高效,那么唯一的方法就是分别编写字段。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM