2011-06-16 165 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對象,因爲它會之前是空的。