0

ポインター magikry を使用して、バイト データをファイルに書き込む次のメソッドを使用して C++ クラスを保存したいと考えています。

result Osp::Io::File::Write (const void *buffer, int length);
  • パラメーター:

    • buffer— 書き込まれるバイトデータを含むユーザー提供のバッファへのポインタ
    • length— バッファー長 (バイト単位)
  • 例外:

    • E_SUCCESS— メソッドは成功です。
    • E_INVALID_STATE— ファイルはまだ開かれていません。
    • E_ILLEGAL_ACCESS— ファイルが書き込み操作用に開かれていないか、権限が不十分なためにアクセスが拒否されました。
    • E_INVALID_ARG— 次のいずれかの状況が発生しました。
      • 指定されたバッファにはヌル ポインタが含まれています。
      • 指定されたバッファー長が 0 以下です。
      • ファイル ハンドルが無効です (ファイルが別の方法で閉じられているか、メモリが破損しています)。
    • E_STORAGE_FULL— ディスク容量がいっぱいです。
    • E_IO— メディアが突然排出されたり、ファイルの破損が検出されたりして、予期しないデバイス障害が発生しました。

何らかのバッファリングがあるとは想定したくありませんが、各バイトがフラッシュのブロック全体を書き換える原因にはならないと確信していますが、たとえば、オブジェクトへのポインタ( )によるクラス(および静的フィールドなどの他のもの*this

4

1 に答える 1

2

C ++では、「生の」オブジェクトをファイルに書き込むのではなく、シリアル化します。魔法はありません。シリアル化コードを自分で作成する必要があります(便宜上、演算子<<とをオーバーロードします)。>>

メモリをダンプするだけで古いCスタイルで実行できますが、これがCで一般的に発生する問題(アライメント、システム間でデータを転送する際のエンディアンの問題)に加えて、C ++(内部クラス表現)によって発生する問題も発生します。 、vテーブルなどの「隠された」データメンバーの可能性)。

異なるシステム間や異なるソフトウェア間で転送できる信頼性の高いデータの読み取りと書き込みを確実に行う場合は、シリアル化を実装する方が適切であり、ショートカットを探す必要はありません。

そのためにBoost.Serializationのようなライブラリを使用できます。

于 2012-01-23T23:36:19.933 に答える