2016-12-15 5 views
1

ostreamオブジェクトに一連のデータを書き込んで、書き込まれたバイト数を返したいとします。たとえば:std :: ostreamオブジェクトに書き込まれたバイト数を追跡​​するにはどうすればよいですか?

using namespace std; 
size_t writeStuffToStream(ostream &stream) 
{ 
    stream << some_string << some_integer << some_other_arbitrary_object << endl; 
    return number_of_bytes_written; 
} 

ありstringstreamにすべてを書き込み、その外のバイト数を取得し、その後ストリームにstringstreamを書くの明白な回避策があるが、それは、余分な時間とメモリを取ります。

私が書きたいと思っていたすべてのデータが既存の文字列だった場合は、問題はありません。問題は、some_integersome_other_arbitrary_objectです。

+1

streambufオブジェクトを連鎖させることができるので、std :: streambufからcountbufを取得し、カウンタ情報を記録した後に操作を元のstreambufに委譲することができます。 http://www.mr-edd.co.uk/blog/beginners_guide_streambuf –

答えて

0

ostreamtellp()メソッドを使用します。

提供されたostreamが位置をサポートしていない場合、これは失敗する可能性があることに注意してください。その場合は、データをフォーマットするためのostringstreamを一時的に作成し、stringを抽出し、長さを取得して入力ostreamに送信します。

おそらく別のostreamに送信し、出力文字をカウントするカスタムostreamを書くこともできます。 ostreamでオーバーライドして文字だけを書く仮想メソッドを見つけることを期待していましたが、見つけられませんでした:(ストリングストリームコードを再利用して、バッファ書き込みを他のostreamへの書き込みに置き換えることができます)string-stream.ccは約500行です

+0

ええ、私は、 'tellp()'がすべてのオブジェクトに対して動作することが保証されていないという事実から少しは控えています。中間の 'stringstream'を作成する必要はありません。最初に書き込まれたバイト数を数えることができない場合は、書き込まれたバイト数をカウントできるカスタム' ostream'をどうすれば作成できますか? – Matt

+0

私はそれを見て、私のコメントを更新する;) –

関連する問題