2011-03-31 10 views
4

インクリメントたstreamposオブジェクト

for (std::streampos Position = 0; Position < 123; Position++) 
{ 
    // Use Position to access something... 
} 

はしかし、std::streamposoperator++が過負荷状態に持っていないことが表示されます。

次のエラーでPosition = (Position + 1)結果を使用しようとすると:

ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: 

このため任意の回避策はあり、または私はファイルのための十分な大きさであることlong unsigned intに頼らなければならないのですか?

答えて

4

ストリーム内のオフセットを表すstd::streamoffを試してください。これは、プリインクリメント/ポストインクリメント/デクリメント演算子の両方をサポートします。 Maxpmさんのコメントに

The underlying type is implementation defined, but must be able to be consistently converted to both streamsize and fpos (thus, to streampos too)

編集:あなたは、どこかにstreamoffを適用することができ、それios::begまたはarbitary streamposios::begに適用すると、通常のように動作しますstreampos。それをstreamposに適用し、streampos+streamoffを得ました。

+0

ストリームオフセットとストリーム位置の違いは何ですか? – Maxpm

+0

streamposはストリーム内の位置です。ストリームオフは、このような位置からのオフセットです。 :-) –

+0

@Bo:WoopsはMaxpmのコメントを完全に見落としています。 ;) – Xeo

3

使用+=operator +が実際にstreampossteamoff、ないintのために定義されているため

for (std::streampos Position = 0; Position < 123; Position += 1) 

+は動作しません。

つまり、1streamoff(おそらくunsigned longのtypedef)に変換される可能性がある2つの暗黙的な変換が存在することを意味します。あるいは、streamposは暗黙的にstreamoffに変換され、1が追加されます。

2

std::streamposは数値型ではなく、数値型との変換 をサポートしていますが、数値型ではありません。 位置の算術演算を行う場合は、std::streamoffを使用する必要があります(また、seekを呼び出すときは 引数を指定してください)。

また、それはバイナリモードで開かれ、「C」 ロケールが吹き込まれていない限り、あなたは ファイル内の任意の位置に求めることができないということを忘れないでください。

関連する問題