如何清除std :: ostringstream实例以便可以重用它?

mat*_*975 6 c++ string std stringstream

可能重复:
如何重用ostringstream?

我一直在使用std::ostringstream转换floatint值到字符串但我无论如何都找不到重用实例.为了说明我的意思,以下是我尝试用来清除流的方法

 #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;
 }
Run Code Online (Sandbox Code Playgroud)

生成输出

 Test
 Test----
 Test----****
Run Code Online (Sandbox Code Playgroud)

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

Ker*_* SB 18

使用stream.str("");使底层字符串空单.更好的是,不要重复使用对象.在C++中,理念是在需要时创建一个对象并在完成后处理它:

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

{
    std::ostringstream oss;
    oss << 20.5;
    std::cout << oss.str();
}
Run Code Online (Sandbox Code Playgroud)

或者更好的是:

std::cout << static_cast<std::ostringstream&>(std::ostringstream() << 10).str();
Run Code Online (Sandbox Code Playgroud)

  • 一般同意你的帖子,除了以*或更好的部分开头的部分:*以及随后的其余部分.你不可能认为**更好**,不是吗?! (3认同)
  • 没有"C++中的哲学可以在你需要时创建一个对象并在你完成时处理"并且从未有过.使用str("")调用是"重置"字符串流的完美方式.这是你使用static_cast的提示,通常预测它永远不会被用在应用程序代码中,这是一个反C++ - 哲学的东西. (3认同)

Max*_*ert 10

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

stream.str("");
Run Code Online (Sandbox Code Playgroud)

会做你想做的.