2017-06-12 268 views
-2

我想檢查ostringstream對象是否爲空,即它不包含任何字符序列?C++如何檢查ostringstream是否爲空

我檢查了cpp reference for ostringstream但它仍然不清楚。

+0

什麼不清楚實際的錯誤信息?你可能需要'if(oss.str()。empty())'?即使你提到的那個蹩腳的參考資料也告訴你,沒有這樣的功能。 –

+0

您可以使用'str()'方法檢索內容並檢查其內容是否爲空,或者您可以使用['peek()'](http://en.cppreference.com/w/cpp/io/ basic_istream/peek)方法 – WhiZTiM

+0

使用str()在緩衝區中創建一個副本,對我的用例來說不是很好http://www.cplusplus.com/reference/sstream/ostringstream/str/ – amey91

回答

2

您可以爲任何其他std::ostream子檢查它的大小你會的方式:

std::ofstream ofs; 
std::streampos pos = ofs.tellp(); // store current location 
ofs.seekp(0, ios_base::end);  // go to end 
bool empty = (ofs.tellp() == 0); // check size == 0 ? 
ofs.seekp(pos);     // restore location 

對於輸入流(istringstreamifstream,等等),那麼你會使用tellg()seekg()代替。

問:您需要在獲取其大小之前刷新流嗎?

答:從理論上講,你不這樣做,但std文檔沒有提及它的任何內容......所以需要這樣做可能取決於實現。

std::ostream上,如果您最近插入了字節,並且不在流的末尾,我會推薦它。在大多數涉及輸出流的使用情況下,您將追加到流並位於其遠端,在這種情況下,不需要存儲和恢復搜索指針位置。

無論如何,沖洗std::ostringstream並不是一個昂貴的操作。在輸出文件流上,我個人會呼叫flush(),因爲無論如何我都無法獲取流中的大小。總結起來,我的個人建議是在獲得它們的大小之前清除輸出流,除非你確定知道你最後的結果。

請注意,對於std::ifstream,上述技術是獲取文件大小的唯一方法。

+0

您需要在測量之前沖洗流路嗎?如果不是,爲什麼不呢? –

+0

@TobySpeight感謝您的好格式! –