2017-06-12 280 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感谢您的好格式! –