我想检查ostringstream对象是否为空,即它不包含任何字符序列?C++如何检查ostringstream是否为空
我检查了cpp reference for ostringstream但它仍然不清楚。
我想检查ostringstream对象是否为空,即它不包含任何字符序列?C++如何检查ostringstream是否为空
我检查了cpp reference for ostringstream但它仍然不清楚。
您可以为任何其他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
对于输入流(istringstream
,ifstream
,等等),那么你会使用tellg()
和seekg()
代替。
问:您需要在获取其大小之前刷新流吗?
答:从理论上讲,你不这样做,但std文档没有提及它的任何内容......所以需要这样做可能取决于实现。
在std::ostream
上,如果您最近插入了字节,并且不在流的末尾,我会推荐它。在大多数涉及输出流的使用情况下,您将追加到流并位于其远端,在这种情况下,不需要存储和恢复搜索指针位置。
无论如何,冲洗std::ostringstream
并不是一个昂贵的操作。在输出文件流上,我个人会呼叫flush()
,因为无论如何我都无法获取流中的大小。总结起来,我的个人建议是在获得它们的大小之前清除输出流,除非你确定知道你最后的结果。
请注意,对于std::ifstream
,上述技术是获取文件大小的唯一方法。
您需要在测量之前冲洗流路吗?如果不是,为什么不呢? –
@TobySpeight感谢您的好格式! –
什么不清楚实际的错误信息?你可能需要'if(oss.str()。empty())'?即使你提到的那个蹩脚的参考资料也告诉你,没有这样的功能。 –
您可以使用'str()'方法检索内容并检查其内容是否为空,或者您可以使用['peek()'](http://en.cppreference.com/w/cpp/io/ basic_istream/peek)方法 – WhiZTiM
使用str()在缓冲区中创建一个副本,对我的用例来说不是很好http://www.cplusplus.com/reference/sstream/ostringstream/str/ – amey91