如何清空streamstring的缓冲区?

4

我有一个包含两个循环的字符串流,它正在消耗我的内存。那么如何正确清除字符串流的缓冲区呢?简单来说就是这样:

stringstream ss (stringstream::in | stringstream::out);

for()
{
    for()
    {
        val = 2;
        ss << 2;
        mystring = ss.str();
        // my stuff
    }
    // Clear the buffer here
}

它写了2,然后是22,再然后是222……我尝试使用.clear()或.flush()但这不是那个问题。那么我该怎么做呢?


1
我会把stringstream放进循环中。 - Marius Bancila
如果我在循环中放置std::stringstream ss;,它会在RAM中创建许多ss并将其烧毁,对吗?还是它会在循环结束时删除ss,因为它是在循环中创建的?(感觉这是一个新手问题 :) 但我就是!) - bdelmas
它在程序循环时被创建和销毁。顺便问一下,“烧掉RAM”是什么意思? - Marius Bancila
我的应用程序在30秒内增长到2Go并崩溃了。 "它在程序循环中创建和销毁",我不知道这一点,我以为它会创建许多ss,并在函数/应用程序/对象的结尾处销毁。谢谢。 - bdelmas
3个回答

8
明显的解决方案是每次使用一个新的stringstream,例如:
for (...) {
    std::stringstream ss;
    for (...) {
        //  ...
    }
}

这是使用 stringstream 的设计方式。(另外:你真的需要一个 stringstream 吗,还是只需要一个 ostringstream?)

我在这里使用它来将一个浮点数转换为字符串,并将该字符串放入另一个较大的字符串中。怎样才能做到最好呢?如果我在循环中放置std::stringstream ss;,那么会在内存中创建许多ss吗? - bdelmas
1
std :: ostringstream ss; ss << theDouble; theString + = ss.str();如果 stringstream 在循环中,仍然只会有一个在内存中。 - James Kanze

7

当你想要清空多余字符时,请使用ss.str(""); (编辑:谢谢)。

如果您的流在先前的转换过程中设置了任何错误标志,请使用.clear()


1
通常这还不够。您也应该使用 seekp(0)seekg(0) - Naszta
@Naszta 在设置了字符串并清除流之后,我能够在没有seekp/seekg部分的情况下完成它。 - jonsca
@jonsca:在这种情况下,这取决于实现方式。我以前遇到过很多问题。(我开发多平台,我不记得哪个实现方式有/有这个问题了。) - Naszta
1
供将来参考,这在 Scott Meyers 的 C++ 书籍中有涉及(我推荐阅读)。 - csl
1
@csl: 在亚马逊上可以找到《Effective C++》、《More effective C++》和《Effective STL》。而在中国,也可以找到《Effective STL》的完整版书籍,链接为:http://www.uml.org.cn/c++/pdf/EffectiveSTL.pdf。 - Naszta

4
如果您使用的是C++0x:
ss.swap(stringstream());

Visual Studio 2010(SP1)支持它。

如果您不使用C++0x:

ss.seekp(0);
ss.seekg(0);
ss.str("");
ss.clear();

它不会清除内存,但是你可以使用你的 stringstream 对象,因为在使用之前它将为空。


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