2010-09-21 50 views
6

我想用stringstream做一個任務的實驗,但是我對它的工作原理有些困惑。我做了一個快速搜索,但找不到任何可以回答我的問題的東西。如何讀取動態大小的字符串流?

說我有一個動態大小的流,我怎麼知道什麼時候停止寫入變量?

string var = "2 ++ asdf 3 * c"; 
stringstream ss; 

ss << var; 

while(ss){ 
    ss >> var; 
    cout << var << endl; 
} 

和我的輸出是:

2 
++ 
asdf 
3 
* 
c 
c 

我不知道爲什麼我得到,在年底額外的 'C',尤其是因爲_M_in_cur = 0x1001000d7 「」

+0

事實上,它是一個stringstream並沒有什麼改變 - 你可以像讀取任何其他流一樣讀取它。 – 2010-09-21 03:31:18

回答

17

你得到最後額外c,因爲您在執行提取後不測試流是否仍然良好:

while (ss)  // test if stream is good 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 

您需要測試執行提取操作和使用結果時的流狀態。典型地,這是通過在循環條件進行萃取來完成:

while (ss >> var) // attempt extraction then test if stream is good 
{ 
    cout << var; // use result of extraction 
} 
+0

謝謝,我想我的問題應該被視爲如何檢查流的條件。 – 2010-09-21 07:08:40

+0

@ thomast.sang接受他的回答。 – gsamaras 2016-05-29 00:32:32

-1

還有一個成員函數良好()在此進行測試,如果流可被用於I/O操作。因此,使用這種上面的代碼可以變成

while(ss.good()) // check if the stream can be used for io 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 
+1

這在一般情況下仍然不正確:如果您嘗試提取「int」,並且緩衝區中的下一個可用字符不能被讀爲「int」,則提取將失敗。 – 2010-09-21 14:13:54

0

while(ss)條件檢查你的代碼檢查是否從流最後一次讀取的成功與否。但是,即使您已閱讀字符串中的最後一個單詞,此檢查也會返回true。只有在代碼中提取ss >> var纔會使該條件成爲假,因爲已到達流的末尾&沒有任何東西可以提取到變量var中。這就是你最後得到額外'c'的原因。您可以通過按照James McNellis的建議更改您的代碼來消除此問題。