如何清除 std::ostringstream 实例以便可以重用? [复制]

Posted

技术标签:

【中文标题】如何清除 std::ostringstream 实例以便可以重用? [复制]【英文标题】:How do you clear a std::ostringstream instance so it can be reused? [duplicate] 【发布时间】:2012-07-12 19:13:28 【问题描述】:

可能重复:How to reuse an 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/ 的文档,但那里似乎没有任何东西可以满足我的需求。有没有办法重置或清除流??

【问题讨论】:

【参考方案1】:

使用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(""); 对我来说总是感觉像个黑客。 基本同意您的帖子,除了以开头的部分或更好: 和后面的其余部分。你不可能认为那是更好,对吗?! @HappyGreenKidNaps:这只是一个例子。当然你可以写std::cout &lt;&lt; 10 并完成它。如果我需要一个字符串,我想我会说std::to_string(10) 不存在“C++ 中的哲学,即在需要时创建对象并在完成时处理”这样的东西,而且从来没有。使用 str("") 调用是“重置”字符串流的完美方式。使用 static_cast 是您的提示,通常预测它永远不会在应用程序代码中使用,这是一种反 C++ 哲学的东西。【参考方案2】:

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

stream.str("");

会做你想做的。

【讨论】:

以上是关于如何清除 std::ostringstream 实例以便可以重用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将ostringstream直接写入cout

std::ostringstream输出流详解

std::ostringstream 转std::string

C++ std::ostringstream 是什么 怎么用

c++ std::ostringstream vs std::string::append

转载C++中替代sprintf的std::ostringstream输出流详解