Это будет записывать record
в точности так, как оно хранится в памяти - но компилятор свободен для вставки отступов между членами, и если это произойдет, это запишет все значения, которые будут в этих байтах заполнения.
Многие (большинство?) Компиляторы имеют непереносимые способы запрета вставки этих отступов - MSVC использует #pragma pack(1)
, gcc использует __attribute(__packed__)
(и по крайней мере некоторые версии поддерживают синтаксис #pragma pack
какхорошо).
Также возможно, что вы определили record
, чтобы включить в данные некоторые нулевые байты (например, массивы char с нулевыми терминаторами, чтобы сделать их строками).Поскольку вы не показали определение record
, трудно предположить, применимо ли это к делу или нет.
Редактировать: на основании вашего комментария, похоже, что последнее имеет место.Первое, что я хотел бы сделать, это то, что удаление их может быть не очень хорошей идеей.Если вы удалите их, вам придется сделать что-то , чтобы программа, считывающая данные, значила, где заканчивается одно поле и начинается следующее (если поля не имеют фиксированной ширины, что может быть обработано неявно).
Наиболее очевидная возможность - предшествовать каждому полю его длиной.Это имеет то преимущество, что если / когда вы хотите искать файл, вы можете переходить от одного поля к другому, не читая данные, чтобы найти завершающий байт.Однако обычно вместо этого я бы использовал индекс - файл, содержащий смещения файлов для последовательных записей в данных (и, возможно, некоторые ключевые данные для каждой записи, чтобы вы могли быстро выполнять поиск на основе содержимого записей), поэтомуВы можете быстро найти местоположение записи и прочитать ее данные.Если у вас нет необычайно больших полей, поиск отдельных полей редко приводит к большим результатам.