Работа с различными архитектурами при загрузке данных с использованием stdio - PullRequest
2 голосов
/ 10 июля 2011

Я хочу прочитать некоторые данные из файла. Скажите целое число:

fread(&var1, 4, 1, f);

Где var1 будет целым числом. Но потом я подумал, что это небезопасно, поскольку нет никакой гарантии, что целое число имеет длину 4 байта. (Ради этого вопроса я игнорирую другие проблемы, такие как feof и ferror).

Я также вскоре понял, что было даже больше проблем, чем просто размер int, таких как порядковый номер системы и, возможно, другие, о которых я даже не думал.

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

Спасибо.

Ответы [ 2 ]

4 голосов
/ 10 июля 2011

Чтобы избежать проблемы с размером, вы должны сделать:

fread(&var1, sizeof(var1), 1, f);

Если вы беспокоитесь о том, что размер int может варьироваться в зависимости от платформы, которая записывает данные, и платформы, которая считывает данные, то у вас есть более фундаментальная проблема. В этом сценарии следует избегать использования int, short и т. Д. И использовать типы, определенные в <stdint.h>, например int16_t, uint32_t.

Для решения проблем с порядком байтов вам следует подумать о написании вспомогательных функций, которые явно пишут / читают отдельные байты в известном порядке, например:

void write_uint32_t(uint8_t *buf, uint32_t x)
{
    buf[0] = (uint8_t)(x >> 0);
    buf[1] = (uint8_t)(x >> 8);
    buf[2] = (uint8_t)(x >> 16);
    buf[3] = (uint8_t)(x >> 24);
}

Все вышеперечисленное относится только к целочисленным типам. Для типов с плавающей точкой не существует идеального универсального решения.

1 голос
/ 10 июля 2011

Всегда используйте оператор sizeof() для получения размера типов. Никогда не полагайтесь на жестко закодированные значения!

...