2011-06-16 128 views
4

我在两个循环中有一个流串,它正在燃烧我的RAM。那么如何正确清除一个steamstring的缓冲区?它是这样的简化:如何清除流串的缓冲区?

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放入循环中。 – 2011-06-16 10:25:41

+0

如果我把std :: stringstream ss;在一个循环中,它会在RAM中创建多个ss并将其烧坏。或者它会在循环结尾删除ss,因为它是在循环中创建的? (这里感觉一个noob问题:)但我是! ) – Nazka 2011-06-16 10:52:20

+0

它在程序循环时被创建和销毁。顺便说一句,你是什么意思“刻录RAM”? – 2011-06-16 13:49:19

回答

7

显而易见的解决方案是一种新的stringstream每一次,例如:

for (...) { 
    std::stringstream ss; 
    for (...) { 
     // ... 
    } 
} 

这是正路stringstream被设计用来使用。 (另外:你 真的想要一个stringstream,或只是一个ostringstream?)

+0

我在这里使用它来改变一个字符串中的浮点数,并把这个字符串放在另一个大字符串中。最好做什么?如果我把std :: stringstream ss;在一个循环中,它会在RAM中创建很多ss? – Nazka 2011-06-16 10:42:26

+1

'std :: ostringstream ss; ss“theDouble; theString + = ss.str();'如果'stringstream'在循环中,一次只有一个在内存中。 – 2011-06-16 12:12:18

5

设置ss.str("");当你想清除多余的字符(编辑:谢谢你)。

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

+2

我认为它是'ss.str(“”);'becase'ss.str()'返回一个字符串副本而不是引用。 – 2011-06-16 10:41:29

+0

@波佩森谢谢你,我相信你是对的! – jonsca 2011-06-16 10:45:11

+1

这通常是不够的。你也应该使用'seekp(0)'和'seekg(0)'。 – Naszta 2011-06-16 10:54:17

3

如果你使用的C++ 0x:

ss.swap(stringstream()); 

Visual Studio 2010(SP1)支持它。

如果你不使用的C++ 0x:

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

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