Считать 32-разрядное целое число из двоичного файла в C++?

Мой двоичный файл выглядит следующим образом.

00000000: 0000 0803 0000 ea60 0000 001c 0000 001c
00000010: 0000 0000 0000 0000 0000 0000 0000 0000

левый столбец - это адрес.

Я просто попытался прочитать 0000 0803 (= 2051) следующим образом

ifstream if;
if.open("file");
uint32_t a;
if >> a;

Как и ожидалось... Это не сработало:-(
a был только 0 после выполнения.
Я пробовал long, int, unsigned int, unsigned long. Все не удалось.

Почему они не работают и как я могу достичь этой цели?

Ответ 1

У вас есть две проблемы:

  • Убедитесь, что вы читаете байты, которые вы намереваетесь (не меньше, не больше) из потока.

    Я бы рекомендовал этот синтаксис:

    uint32_t a;

    inFILE.read(reinterpret_cast<char *>(&a), sizeof(a));

  • Убедитесь, что вы интерпретируете эти байты с правильным порядком байтов.

    В: Если вы на ПК, ваш процессор, вероятно, немного endian. Знаете ли вы, что ваш поток данных также мало-северный, или он большой endian?

    Если данные являются большими, я бы рассмотрел стандартные сетевые функции для размещения порядка байтов: ntohl() и т.д.: http://www.retran.com/beej/htonsman.html

и

Следуйте рекомендациям Hcorg и Daniel Jour: не забывайте о параметре "открытый режим" и не забывайте проверять ошибки "открытия файла".

Ответ 2

Откройте файл в двоичном режиме и затем используйте метод read(), например:

uint32_t a;
ifstream file ("file", ios::in | ios::binary);
if (file.is_open())
{
     file.read ((char*)&a, sizeof(a));
}