【问题标题】:How do you clear a std::ostringstream instance so it can be reused? [duplicate]如何清除 std::ostringstream 实例以便可以重用? [复制]
【发布时间】: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/ 的文档,但那里似乎没有任何东西可以满足我的需求。有没有办法重置或清除流??

【问题讨论】:

    标签: c++ string std stringstream


    【解决方案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("");
    

    会做你想做的。

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多