Альтернативы fread и fwrite для использования со структурированными данными - PullRequest
5 голосов
/ 28 марта 2010

Книга Начало программирования на Linux (3-е изд) говорит

"Обратите внимание, что fread и fwrite не рекомендуются для использования со структурированными данными. Отчасти проблема заключается в том, что файлы, записанные с помощью fwrite, потенциально не могут переноситься на разные машины."

Что это значит точно? Какие вызовы мне следует использовать, если я хочу написать переносное устройство чтения или записи структурированных данных? Прямые системные звонки?

Ответы [ 3 ]

3 голосов
/ 28 марта 2010

Книга предостерегает от чтения блока байтов из файла непосредственно в структуру данных.

Проблема в том, что между отдельными элементами структуры данных могут быть безымянные байты заполнения, а количество и позиция этих байтов полностью зависят от реализации.

Вы все еще можете использовать вызовы fread и fwrite для чтения и записи данных из файла и в файл, но вы должны читать и записывать каждый элемент структуры данных по отдельности, а не читать или записывать всю структуру в один раз.

Есть и другие проблемы с переносимостью, о которых вы также должны помнить. Например, различные числовые типы имеют зависящие от реализации размеры. Для переносимости вы можете использовать типы, определенные в заголовке stdint.h.

Могут также быть различия в представлении целых чисел с плавающей запятой и целых без знака, но большинство систем и форматов файлов теперь используют IEEE 754 и два дополнения соответственно, поэтому проблемы совместимости с этими типами встречаются гораздо реже. Просто убедитесь, что вы знаете, что говорят ваши спецификации.

1 голос
/ 13 ноября 2011

Сериализация данных - тема вашего интереса.

Речь идет о размерах переменных, о кодировании (строки могут быть utf-8, utf16 ... и т. Д.), О бесконечности (BigEndian, LowEndian).

Для портативного решения Я бы порекомендовал вам взглянуть на Google ProtocolBuffers и Thrift .

0 голосов
/ 13 ноября 2011

Если переносимость данных вас беспокоит, вам следует изучить сериализацию методов и библиотек, в частности s11n JSON YAML XDR ASN1 Янссон XML и т. Д.

Спросите себя о своих данных и заявлении через пару лет? ...

Текстовые представления, как правило, менее "хрупкие", чем двоичные.

...