2015-08-18 27 views
7

Mój plik binarny wygląda następująco.odczytuje 32-bitową liczbę całkowitą z pliku binarnego

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

lewa kolumna to adres.

Ja tylko starałem się czytać 0000 0803 (= 2051) w następujący sposób

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

jak oczekiwano ... To nie działa :-(
a było tylko 0 po wykonaniu.
próbowałem long, int, unsigned int, unsigned long. wszystko udało

Dlaczego to nie działa i jak mogę osiągnąć cel

+2

Czy sprawdzić, czy plik został otwarty poprawnie? Jaki jest stan strumienia po przeczytaniu? (błąd lub zły stan?) –

+2

pamięta o trybie otwartym - drugi argument do otwarcia (http://en.cppreference.com/w/cpp/io/ios_base/openmode). – Hcorg

+1

Musisz wiedzieć, jaka endianness został użyty podczas zapisywania pliku. Little-endian (na przykład Intel x86): Najmniej znaczący bajt na najniższym adresie, Big-endian (np. W Internecie): Najbardziej znaczący bajt na najniższym adresie. –

Odpowiedz

12

masz dwie kwestie:.?

  1. Ubezpieczenie odczytu bajtów, które mają być (nie mniej, nie więcej) ze strumienia.

    polecam tej składni:

    uint32_t a;

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

  2. Ubezpiecz jesteś interpretując te bajty z właściwej kolejności bajtów.

    P: Jeśli jesteś na komputerze PC, Twój procesor to prawdopodobnie little endian. Czy wiesz, czy twój strumień danych jest również mało-endyjski, czy jest to duży endian?

    Jeśli dane są big-endian, Pomyślę standardowe funkcje sieciowe, aby dostosować kolejność bajtów: ntohl() itp: http://www.retran.com/beej/htonsman.html

TAKŻE:

Obserwuj Hcorg i doradztwo Daniel Jour: nie zapomnij o parametrze "tryb otwarty" i nie zapomnij sprawdzić błędów "otwórz plik".

+0

W rzeczywistości istnieją 3 problemy: on również musi odczytać dane szesnastkowe, co jest prawdopodobnie największym problemem. –

+0

Byłoby lepiej wyjaśnić niektóre powody pierwszego problemu. (= Dlaczego polecasz funkcję 'read', a nie strumień wejściowy?) – plhn

+2

dlaczego' '' nie działa? czy to udokumentowane zachowanie? – zhangxaochen

3

Otwórz plik w trybie binarnym, a następnie użyć read() metodę, coś jak:

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