2009-08-05 4 views
0

ストリームからの読み取りを試みることはできますが、ストリーム自体を変更しないでください(成功したかどうかをboolに戻します)。ストリームからの非破壊読み取り

template <typename T> bool SilentRead (stringstream& s, T& value) { 
    stringstream tmp = s; 
    tmp >> value; 
    return tmp; 
} 

stringstreamにはパブリックコピーコンストラクタがないため、これは機能しません。 これを行うには?

stringstreamをistreamに置き換えても解決できますか?

答えて

1

にstringstreamは、thisに参照のうえすることで、設定/位置を取得するためにtellgseekgを使用することができます。したがって、あなたはできる:
1.現在の位置を得る
2.
を読む3.現在の位置を、ちょうど読み込んだものに設定する。

+1

もちろん、すべてのストリームでは機能しません。 – MSalters

+0

もちろん:)。私はstd :: stringstreamを厳密に参照していました(通常のファイルでも同様に動作します)。 –

0

あなたがかいま見()を探している - http://www.cplusplus.com/reference/iostream/istream/peek/

+1

PEEKは、1つの文字を先読みすることができ、それは、しません(ストリームバッファラッパーのstdの実装:: streambufのインタフェース基本となるストリームバッファへのI/Oを転送する場合)? –

2

一般にこれは不可能です。基礎となるstreambufにはインタフェースがありません。ただし、streambufラッパーを作成することができます。ストリームで非破壊的な読み込みを行うことはできませんが、streambufラッパーで行うことができます。

関連する問題