32アプリケーションでintをfstreamに書き込み、64ビットアプリケーションでそのintを読み取った場合、値が異なることを期待する必要がありますか?もしそうなら(そして私はそうだと思います)、アーキテクチャに依存しないストリーム操作を実現するための最良の方法は何ですか?
2 に答える
operator<<
とを使用して読み書きする場合operator>>
、整数が両方のタイプに収まるほど小さいと仮定すると、プラットフォームに依存しません。これは、ifがテキストとして書き込まれるためです。とを使用するostream::read
とosteam::write
、バイナリデータを書き込むため、プラットフォームに依存しなくなります。
生のパフォーマンスが必要ない場合は、テキスト形式を使用するのがプラットフォームの独立性を実現する最も簡単な方法です。より良いパフォーマンスが必要な場合は、シリアル化ライブラリを確認する必要があります。Boostには優れたクロスプラットフォームがあります。
バイナリで書くかASCIIで書くかによって異なります。数値を ASCII (UTF-8) で記述した場合、読み取りは同じ結果を生成するはずです。
boost::serializaton
パッケージを使用して、制御された統一された方法でデータを読み書きすることをお勧めします。
ただし、逆方向、つまり 64 ビットから 32 ビットで動作するかどうかは定かではありません。s を 64 ビットにコンパイルする場合、コンパイラによって異なりますint
。32 ビットの s に読み取ることができない値を書き込む可能性がありますint
。フォーマットされたストリームに書き込む場合でも。
ただし、C++ の an のサイズとしての保証はありませんint
。単に、サイズが a より大きいか等しいだけですshort
。それはコンパイラ次第です。
GMP を使用して大きな整数を処理できることを本当に確認したい場合は、データを自動的に検証します。