Это верно не только при записи в файлы, но и в память. Тот факт, что структура дополняется в памяти, приводит к тому, что заполнение отображается в файле, если структура записывается побайтово.
В общем, очень трудно с уверенностью воспроизвести точную схему заполнения, хотя я полагаю, что некоторые эвристики могли бы вас продвинуть довольно далеко. Помогает, если у вас есть объявление структуры, для анализа.
Как правило, поля размером более одного символа будут выровнены, так что их начальное смещение внутри структуры будет кратно их размеру. Это означает, что short
s обычно будет на четных смещениях (делится на 2, при условии sizeof (short) == 2
), в то время как double
s будет на смещениях, кратных 8 и т. Д.
ОБНОВЛЕНИЕ : Именно по таким причинам (а также по причинам, связанным с порядком байтов), обычно плохая идея выгружать целые структуры в файлы. Лучше делать это по полю, например:
put_char(out, a.c);
put_int(out, a.i);
Предполагая, что put
-функции записывают только байты, необходимые для значения, это создаст в файле версию структуры без отступов, решая проблему. Также возможно обеспечить правильное, известное упорядочение байтов, написав эти функции соответствующим образом.