При записи struct в файл записывается слишком много байтов - PullRequest
2 голосов
/ 20 июля 2010

Я пытаюсь написать простую заставку для файлов изображений TGA в качестве учебного упражнения на C ++.Я основываю свой код на примере загрузчика TGA, который объявляет структуру заголовка и затем использует fread () для загрузки всего заголовка за один раз.

Моя программа сейчас не работаетПохоже, что в файл записаны два дополнительных байта.Я напечатал размер моей структуры, и он на два байта слишком большой (20 вместо правильных 18).После небольшого чтения я думаю, что проблема связана с выравниванием данных и заполнением (я не очень хорошо знаю, как хранятся структуры).Я думаю, я мог бы написать компоненты структуры побайтово, вместо того, чтобы использовать fwrite (), чтобы написать всю структуру сразу, что я и собираюсь сделать сейчас.Я предположил, что если бы он работал при загрузке заголовка, он также работал бы при его написании.Было ли мое предположение неверным?

Ответы [ 3 ]

4 голосов
/ 20 июля 2010

Компиляторам разрешено вставлять байты заполнения в структуры, и часто это делается, так что поля выравниваются по соответствующим адресам памяти.

Самое простое решение - дать указание компилятору «упаковать» структуру, чтоне вставлять байты заполнения.Однако это замедлит доступ к данным в структуре, и средства для этого зависят от компилятора.Если вы хотите быть переносимым и эффективным, единственный способ - это написать поля по отдельности.

1 голос
/ 20 июля 2010

Не работало даже при загрузке.У вас есть несколько вариантов:

  1. Используйте директивы, специфичные для компилятора (#pragma pack и т. Д.), Чтобы ваша структура была размером 18 байт.

  2. Напишите код более переносимым, используя смещения и указатели для получения / установки полей буфера.

0 голосов
/ 20 июля 2010

Элементы структуры обычно располагаются на границах 4 байта.

если в вашей структуре есть шорты или символы, структура будет больше, чем сумма размеров отдельных элементов.

...