В книге, Начинающей Программирование Linux (3-й редактор), говорится
"Обратите внимание, что освободил, и fwrite не рекомендуются для использования со структурированными данными. Часть проблемы - то, что файлы, записанные с fwrite, являются потенциально непортативными между различными машинами".
Что это означает точно? Какие вызовы я должен использовать, если я хочу записать портативное средство чтения структурированных данных или устройство записи? Вызовы целевой системы?
Книга предостерегает от чтения блока байтов из файла непосредственно в структуру данных.
Проблема заключается в том, что между отдельными элементами структуры данных могут быть безымянные байты заполнения, а количество и положение этих байтов полностью зависят от реализации.
Вы по-прежнему можете использовать вызовы fread
и fwrite
для чтения и записи данных из файла и в файл, но вы должны читать и записывать каждый элемент структуры данных индивидуально, а не чем чтение или запись всей структуры сразу.
Есть и другие проблемы с переносимостью, о которых вы также должны помнить. Например, различные числовые типы имеют размеры, зависящие от реализации. Для переносимости можно использовать типы, определенные в заголовке stdint.h
.
Также могут быть различия в представлении целых чисел с плавающей запятой и беззнаковых чисел, но в большинстве систем и форматов файлов теперь используется стандарт IEEE 754 и дополнение до двух, соответственно, поэтому проблемы совместимости с этими типами возникают гораздо реже. Просто убедитесь, что вы знаете, что говорят ваши спецификации.