C++如何检查ostringstream是否为空

4

我想检查ostringstream对象是否为空,即它不包含任何字符序列?

我查看了cpp reference for ostringstream,但对我来说仍然不太清楚。


这个错误信息到底有什么不清楚的?你可能需要用 if(oss.str().empty()) 吧?即使是你提到的那个糟糕的参考文献也告诉你没有这样的函数。 - πάντα ῥεῖ
使用str()会创建缓冲区内容的副本,这对我的用例不是很好。http://www.cplusplus.com/reference/sstream/ostringstream/str/ - amey91
@amey91:“使用str()会创建缓冲区内容的副本”。它并不是这样的(http://en.cppreference.com/w/cpp/io/ostrstream/str),你所参考的内容可能是错误的,或者你误解了它。我说你正在使用的参考资料只是毫无用处的废话。 - πάντα ῥεῖ
2
@πάνταῥεῖ 我认为你把 std::ostrstream::strstd::basic_ostringstream::str 搞混了?ostringstream 被定义为 basic_ostringstream<char>。 - Frank Boyne
@Paul 我看到了,抱歉。 - πάντα ῥεῖ
显示剩余5条评论
1个回答

6
您可以按照其他任何std::ostream子类的方式检查其大小:
std::ofstream ofs;
std::streampos pos = ofs.tellp();  // store current location
ofs.seekp(0, std::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,上述技术是获取文件大小的唯一方法。


你需要在测量之前清空流吗?如果不需要,为什么不需要? - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接