私のバイナリファイルは次のようになります。
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
。すべて失敗しました。
これらが機能しないのはなぜですか?どのようにして目標を達成できますか?
次の2つの問題があります。
ストリームから目的のバイトを読み取ることを保証します(それ以上、それ以下ではありません)。
私はこの構文をお勧めします:
_uint32_t a;
_
inFILE.read(reinterpret_cast<char *>(&a), sizeof(a));
これらのバイトを正しいバイト順序で解釈していることを確認してください。
Q:PCを使用している場合、CPUはおそらく リトルエンディアン です。データストリームもリトルエンディアンか、それともビッグエンディアンかを知っていますか?
データがビッグエンディアンである場合、バイトオーダーに対応する標準のネットワーキング関数:ntohl()
などを検討します。 http://www.retran.com/beej/htonsman.html
また:
HcorgとDaniel Jourのアドバイスに従ってください。「オープンモード」パラメータを忘れないでください。また、「ファイルオープン」エラーをチェックすることを忘れないでください。
バイナリモードでファイルを開き、次のようなread()
メソッドを使用します。
uint32_t a;
ifstream file ("file", ios::in | ios::binary);
if (file.is_open())
{
file.read ((char*)&a, sizeof(a));
}