2016-12-21 17 views
0

私のプロジェクトの1つでは、大きなファイルにある特定のデータチャンクに関する位置情報をキャッシュしなければなりません。私はすでにマップに配置されたstd::basic_istream<char>::pos_typeの周りに構築された小さなAPIを実装しました。安全にstd :: basic_istreamをシリアル化する方法<char> :: pos_type?

これらのディスクリプタをバイトストリームにシリアル化し、ディスクに書き込んで、それ以降の使用(他の* nix-machineでも同様)する必要があります。私は、このタイプはプラットフォームに依存していますが、むしろPODタイプであることを読んでいます。だから私の質問は:

  • オフセットだけでなく何かを保存する方が良いでしょうか?例えば。 std::fpos<std::mbstate_t>読書構造の状態を保つ?
  • std::basic_istream<char>::pos_type(および必要に応じてその他の情報)からオフセットデータを安全に取得して復元するにはどうすればよいですか?

ありがとうございます。

+0

実際に文字内の状態をシリアル化するのは気になりますか?あなたは実際にUTF-8などを使用していますか?単一の文字の中にある位置をシリアル化する必要がありますか? –

+0

いいえ私はアトミックバイトオフセットだけに興味があります。しかし、おそらくパフォーマンスに影響を与える可能性のあるストリーム読み込み構造体の隠れた状態については、私には問題ありません。 – Crank

+0

ちょうど数字である 'streamoff'をシリアライズできるようですね。あなたはキャラクタ内の位置をシリアル化する気にしないと言うので、これで十分です。 int64_tに格納することができます。 –

答えて

0

std::fpos<mbstate_t>の構造は特定されておらず、mbstate_tには自明ではない状態があります。これらのオブジェクトをポータブルにシリアル化することはできません。 オフセット型(std::streamoff)の値を整数型で取得し、その値をシリアル化することができます。

+0

私は 'istream :: tellg()'によって返された 'pos_type'を' std :: streamoff'に静的にキャストすることで実装しました。 'char_traits :: pos_type'は' std :: fpos'で定義されており、変換演算子を 'std :: streamoff'と' std :: fpos'に従ってctrに定義しているので正当な方法ですページ](http://en.cppreference.com/w/cpp/io/fpos)を参照してください。答えてくれてありがとう、Dietmar。 – Crank

関連する問題