2016-12-15 21 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。中派生一個計數流緩衝區,在記錄計數器信息後將操作委託給原始的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

是的,我有點不推by'tellp()'不能保證適用於所有對象,而且我已經提到過我不想創建一箇中間''stringstream'。如果我不能計算寫在第一位的字節,我將如何創建一個自定義的'ostream'來計算寫入的字節數? – Matt

+0

我會看看它並更新我的評論;) –