LINUX.ORG.RU

Как правильно сохранять числа в файл?


0

1

Вопрос, наверное, платиновый, но я не нашёл на него ответа. Как правильно записать целое число в файл и прочитать его потом, да так, чтобы не быть зависимым от платформы?

В стандарте C описано, что целое может быть представлено в прямом и обратном порядках байт, а число со знаком аж тремя разными способами. Очевидно, что просто сделать

fwrite(&number, sizeof (number), 1, file);

будет чревато непереносимостью.

Если посмотреть, как этот вопрос решён в coreutils, то там можно обнаружить макрос, который при необходимости меняет порядок байт. Это самый правильный вариант? А как поступать с отрицательными?

see protobuffer

or UTF 2byte on start of file

qulinxao ★★☆
()

Как правильно записать целое число в файл и прочитать его потом, да так, чтобы не быть зависимым от платформы?

Заранее договориться о том, в каком виде будет храниться это число.

edigaryev ★★★★★
()

А как поступать с отрицательными?

А как _этот_ вопрос решен в coreutils?

cdshines ★★★★★
()
Ответ на: комментарий от Pew-pew

А у тебя уже есть потребность запускать софт под мейнфреймы IBM?

Не занимайся ненужными вещами.

schizoid ★★★
()

Вопрос, наверное, платиновый, но я не нашёл на него ответа. Как правильно записать целое число в файл и прочитать его потом, да так, чтобы не быть зависимым от платформы?

Вписать в заголовок 0xff00, к примеру. При чтении на целевой машине проверять порядок.

andreyu ★★★★★
()

будет чревато непереносимостью.

fprintf, если не хочется париться со сторонними либами. А так переносимей JSON ничего не видел.

border-radius
()

А как поступать с отрицательными?

а теперь назови мне хотя бы одну популярную архитектуру с отрицательными числами НЕ в дополнительном коде

Harald ★★★★★
()

Сохраняешь в задуманном тобой порядке байт.
Во время чтения/записи на платформах с другим порядком - переворачиваешь перед записью и после чтения.

P.S. Если чисел меньше, чем 100500 (например 10) в одном файле, то текстовые форматы спасут отца русской демократии.

trex6 ★★★★★
()

В UNIX принято предпочитать текстовые файлы в том числе по соображениям переносимости. Если уж совсем никак текст не подходит, то надо ответить на вопрос: нужна-ли переносимость _файлов_ или только самой программы? Если второе - то простого fwrite/fread будет достаточно. Если файлы таки надо таскать туда-сюда, то, как уже сказали, hton()/ntoh() («host-to-network-order») и друзья спешат на помощь.

legolegs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.