c ++如何检查ostringstream是否为空
c++ How to check if ostringstream is empty
我想检查 ostringstream 对象是否为空,即它不包含任何字符序列?
我检查了cpp reference for ostringstream,但我还是不清楚。
您可以像检查任何其他 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
对于输入流(istringstream
、ifstream
等),则应使用 tellg()
和 seekg()
。
问:在获取大小之前是否需要刷新流?
A: 理论上,你不需要,但是标准文档没有提到任何关于它的东西......所以是否需要这样做可能取决于实现。
在 std::ostream
上,如果您最近插入了字节并且尚未位于流的末尾,我会推荐它。在涉及输出流的大多数用例中,您将附加到流并位于其远端,在这种情况下没有必要存储和恢复查找指针位置。
刷新 std::ostringstream
在任何情况下都不是一项昂贵的操作。在输出文件流上,我个人会调用 flush()
,因为无论如何我都不会在操作中间获得流的大小。
总而言之,我个人的建议是在获取输出流大小之前刷新输出流,除非您确定自己已经到了最后。
请注意,对于 std::ifstream
,上述技术是获取文件大小的唯一方法。
我想检查 ostringstream 对象是否为空,即它不包含任何字符序列?
我检查了cpp reference for ostringstream,但我还是不清楚。
您可以像检查任何其他 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
对于输入流(istringstream
、ifstream
等),则应使用 tellg()
和 seekg()
。
问:在获取大小之前是否需要刷新流?
A: 理论上,你不需要,但是标准文档没有提到任何关于它的东西......所以是否需要这样做可能取决于实现。
在 std::ostream
上,如果您最近插入了字节并且尚未位于流的末尾,我会推荐它。在涉及输出流的大多数用例中,您将附加到流并位于其远端,在这种情况下没有必要存储和恢复查找指针位置。
刷新 std::ostringstream
在任何情况下都不是一项昂贵的操作。在输出文件流上,我个人会调用 flush()
,因为无论如何我都不会在操作中间获得流的大小。
总而言之,我个人的建议是在获取输出流大小之前刷新输出流,除非您确定自己已经到了最后。
请注意,对于 std::ifstream
,上述技术是获取文件大小的唯一方法。