2015-02-10 45 views
4

我知道stringstream可以使用stringstream::str()進行更新,但是如果在此之後向stringstream輸入了其他內容,則不會按預期工作。下面的代碼演示的現象:使用stringstream更新後,C++ stringstream無法正常工作:str()

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 
int main() 
{ 
    stringstream ss; //ostringstream gives the same output 
    ss << "Original string "; 
    ss.str("Updated string "); 
    ss << "sth else"; 
    cout << ss.str() << endl; 
} 

我希望得到的輸出

Updated string sth else 

但它實際上輸出

sth elsestring 

看來,寧可追加在最近輸入的字符串當前字符串的結尾(在我的例子中爲Updated string),它試圖從頭開始覆蓋它。我的代碼有什麼問題?

Here's a live demo

+2

當使用stringstream時,你必須處理輸入/輸出位置和狀態 - 避免它,並使用istingstream或ostingstream。 – 2015-02-10 23:20:54

+0

@DieterLücking感謝您的建議。我試過ostringstream,它給出了相同的輸出。 – 2015-02-10 23:26:48

+0

另外,不要重複使用它 - 使用一個新的實例,而不是用str來操作緩衝區(....) – 2015-02-10 23:29:17

回答

6

您需要添加std::ios_base::appopenmode。它確保stringstream對象在每次寫入之前查找流的末尾。試試這個:

stringstream ss(std::ios_base::app|std::ios_base::in|std::ios_base::out); 
+0

@ user2079303這些值是未指定的,但行爲在'27.5.3.1.4 [ios :: openmode ]'。此外,它適用於[ideone](http://ideone.com/WIVW1k)。我從你的版本中分出來,因爲你的版本只是傳遞了'ate'? – Pradhan 2015-02-10 23:55:01

+0

@Pradhan我從'ios_base :: ate'改變了'ios_base :: app',但是我的錯誤確實是拋棄了'ios_base :: out'。也就是說,'ios_base :: ate'(帶'ios_base :: out')也可以,對嗎? (以及它在ideone http://ideone.com/dJxnCk) – user2079303 2015-02-10 23:58:40

+0

@ user2079303這很奇怪。我將其解釋爲意味着尋求結束只能在公開的和預期的'吃'失敗[here](http://ideone.com/Z8zi50)。但事實並非如此。 'app'和'ate'都給出了相同的結果。根據[cppreference](http://en.cppreference.com/w/cpp/io/basic_stringbuf/str)和[cplusplus](http://www.cplusplus.com/reference/sstream/stringstream/str)提供的 – Pradhan 2015-02-11 00:06:55