如何清空 std::ostringstream 实例以便重新使用?

6

可能重复:
如何重用ostringstream?

我一直在使用std::ostringstreamfloatint值转换为字符串,但我找不到任何重用实例的方法。为了说明我的意思,以下是示例以及我尝试使用的清除流的方法。

 #include <iostream>
 #include <sstream>
 using namespace std;

 int main() {
   ostringstream stream;
   stream << "Test";
   cout << stream.str() << endl;  
   stream.flush();                
   stream << "----";
   cout << stream.str() << endl; 
   stream.clear();
   stream << "****";
   cout << stream.str() << endl;
   return 0;
 }

生成输出

 Test
 Test----
 Test----****

这给我带来了问题,因为我不得不创建许多ostringstream的实例,这是浪费的。显然,clear()flush()不能满足我的需求,那么有没有办法做到这一点?我查看了http://www.cplusplus.com/reference/iostream/ostringstream/上的文档,但似乎没有任何可以做到我需要的东西。有没有办法重置或清除流?
2个回答

18

使用 stream.str(""); 将底层字符串设为空字符串。更好的方法是不要重用对象。在C++中,哲学是在需要时创建一个对象,在完成后处理掉它:

{
    std::ostringstream oss;
    oss << 10;
    std::cout << oss.str();
}

{
    std::ostringstream oss;
    oss << 20.5;
    std::cout << oss.str();
}

或者更好的方法:

std::cout << static_cast<std::ostringstream&>(std::ostringstream() << 10).str();

+1: 刚想说同样的话。不过,执行stream.str("");总让我感觉像是在使用hack技巧。 - John Dibling
4
总体上我同意你的帖子,除了以 Or better yet: 开头的部分和接下来的内容。你肯定不可能认为那是更好的写法,对吧? - Happy Green Kid Naps
@HappyGreenKidNaps:这只是一个例子。当然,你可以写std::cout << 10并完成它。如果我需要一个字符串,我想我会说std::to_string(10) - Kerrek SB
3
“在C++中制造对象并在使用完毕后进行处理的哲学”这样的说法是不存在的,也从未存在过。使用str("")调用是“重置”stringstream的完美方式。相反,提示您使用static_cast是一种反C++哲学的做法,通常不建议在应用程序代码中使用。 - Ethouris

11

clear() 只清除错误标志。这是一个常见的错误。你需要调用 str(),并传递一个空字符串来清空缓冲区:

stream.str("");

这将实现你所需的功能。


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