2013-05-08 45 views
7

我寫了一個簡短的測試程序,看看我是否可以使用stringstream重複追加到一個字符串。爲什麼我必須在這裏清除std :: stringstream?

在第一個版本中,我得到了Output1,我不明白爲什麼s1保持空白。 我發現我必須做ss.clear()然後在Output2中得到預期的結果。任何人都可以解釋爲什麼沒有明確的說明它不起作用嗎?我會預料到的是,如果我反覆輸入數字並將它們取回到一個字符串中,我應該總是得到這個數字。我不確定數字是否被附加,但這個例子並不重要。

這裏:http://www.cplusplus.com/reference/sstream/stringstream/它說我可以使用任何操作,並沒有限制或要求重置字符串,我可以看到。我也不明白爲什麼之後我會得到沒有ss.clear()的輸出。

另外我有點驚訝,s0保持不變。因此,如果流已經包含內容,那麼流不覆蓋或重置該字符串?

我使用gcc 3.4.4與cygwin。

int main() 
{ 
    std::string s0; 
    std::string s1; 
    int n = 1; 
    std::stringstream ss; 
    ss << n; 
    ss >> s0; 
    cout << "S0:" << s0 << endl; 
    ss.clear();  <-- If I remove this, then s1 stays empty. 
    n = 2; 
    ss << n; 
    ss >> s1; 
    cout << "S1:" << s1 << endl; 
    ss << n; 
    ss >> s0; 
    cout << "S0_2:" << s0 << endl; <-- Why is s0 still 1? 
} 

輸出1:

S0:1 
S1: 
S0_2:1 

輸出2:

S0:1 
S1:2 
S0_2:1 

回答

5

的讀入s0之後,流在EOF狀態。因此,除非EOF狀態被清除,否則下一次讀取失敗。寫入流不會爲您清除讀取狀態。


編輯只是爲了完成答案。 該行爲來自eofbitios_base::iostate的定義,該定義表示如果流處於輸入序列的末尾,則流的狀態將設置該位。

在程序的第一個版本中,由於EOF狀態在第一次讀入s0後未被清除,所以第二次讀取和第三次讀取都不會成功。因此,失敗的第一次讀取將使s1爲空,並且失敗的第二次讀取將使s0不變。

在您的程序的第二個版本中,您在第一次讀取s0後清除ss,允許第二次讀入s1成功。但是,在第二次讀取之後,流再次處於EOF狀態,因此第三次讀取失敗。這使s0保持不變。

+0

謝謝。我想這是文件的地方?我想知道爲什麼這不是在頁面上提到的。我認爲在循環中使用stringstream會是一個不錯的陷阱。 :) – Devolus 2013-05-08 14:32:42

+1

它來自'eofbit'的定義,即它應該在流處於輸入序列末尾時設置。這在第一次閱讀後成爲現實。 – jxh 2013-05-08 14:41:45

相關問題