web-dev-qa-db-ja.com

C ++でバイナリファイルから32ビット整数を読み取りますか?

私のバイナリファイルは次のようになります。

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。すべて失敗しました。

これらが機能しないのはなぜですか?どのようにして目標を達成できますか?

14
plhn

次の2つの問題があります。

  1. ストリームから目的のバイトを読み取ることを保証します(それ以上、それ以下ではありません)。

    私はこの構文をお勧めします:

    _uint32_t a;_

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

  2. これらのバイトを正しいバイト順序で解釈していることを確認してください。

    Q:PCを使用している場合、CPUはおそらく リトルエンディアン です。データストリームもリトルエンディアンか、それともビッグエンディアンかを知っていますか?

    データがビッグエンディアンである場合、バイトオーダーに対応する標準のネットワーキング関数:ntohl()などを検討します。 http://www.retran.com/beej/htonsman.html

また:

HcorgとDaniel Jourのアドバイスに従ってください。「オープンモード」パラメータを忘れないでください。また、「ファイルオープン」エラーをチェックすることを忘れないでください。

27
paulsm4

バイナリモードでファイルを開き、次のようなread()メソッドを使用します。

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