代码之家  ›  专栏  ›  技术社区  ›  twk Mark Adler

如何重用ostringstream?

  •  114
  • twk Mark Adler  · 技术社区  · 17 年前

    4 回复  |  直到 17 年前
        1
  •  162
  •   Johannes Schaub - litb    17 年前

    我在过去使用过一系列clear和str:

    // clear, because eof or other bits may be still set. 
    s.clear();
    s.str("");
    

    它完成了输入和输出字符串流的工作。或者,您可以手动清除,然后寻找适当的顺序开始:

    s.clear();
    s.seekp(0); // for outputs: seek put ptr to start
    s.seekg(0); // for inputs: seek get ptr to start
    

    这将阻止某些公司进行重新分配 str 通过覆盖当前输出缓冲区中的内容。结果如下:

    std::ostringstream s;
    s << "hello";
    s.seekp(0);
    s << "b";
    assert(s.str() == "bello");
    

    std::ends ,放置一个终止null,如下所示:

    std::ostringstream s;
    s << "hello";
    s.seekp(0);
    s << "b" << std::ends;
    assert(s.str().size() == 5 && std::strlen(s.str().data()) == 1);
    

    std::结束 是不推荐使用的 std::strstream ,它可以直接写入堆栈上分配的字符数组。您必须手动插入终止null。然而 我认为它并没有被弃用,因为在上述情况下它仍然很有用。

        2
  •  5
  •   Diego Sevilla    17 年前

    似乎是 ostr.str("")

        3
  •  2
  •   mpromonet    12 年前

    如果要以某种方式清除缓冲区,使其在首次使用前被清除,则需要先向缓冲区添加一些内容(使用MSVC)。

    struct Foo {
        std::ostringstream d_str;
        Foo() { 
            d_str << std::ends;   // Add this
        }
        void StrFunc(const char *);
        template<class T>
        inline void StrIt(const T &value) {
            d_str.clear();
            d_str.seekp(0);  // Or else you'll get an error with this seek
            d_str << value << std::ends;
            StrFunc(d_str.str().c_str());  // And your string will be empty
        }
    };
    
        4
  •  -2
  •   Nicolás    16 年前

    你没有。为了清晰起见,请使用两个不同名称的流,并让优化编译器确定它可以重用旧的流。