2012-01-24 56 views
4

使用istringstream我一個錯誤而執行以下代碼「差一錯誤」,而在C++

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

using namespace std; 

int main (int argc, char* argv[]){ 
    string tokens,input; 
    input = "how are you"; 
    istringstream iss (input , istringstream::in); 
    while(iss){ 
     iss >> tokens; 
     cout << tokens << endl; 
    } 
    return 0; 

} 

它打印出的最後一個記號得到過「你」了兩次,但是,如果我提出以下改變一切正常。

while(iss >> tokens){ 
    cout << tokens << endl; 
} 

任何人都可以解釋我while循環如何運作。謝謝

回答

9

這是正確的。您讀過流尾後,條件while(iss)僅失敗。所以,從流中提取"you"後,它仍然是真的。

while(iss) { // true, because the last extraction was successful 

所以你嘗試提取更多。此提取失敗,但不會影響存儲在tokens中的值,因此會再次打印。

iss >> tokens; // end of stream, so this fails, but tokens sill contains 
       // the value from the previous iteration of the loop 
cout << tokens << endl; // previous value is printed again 

由於這個原因,你應該總是使用你展示的第二種方法。在這種方法中,如果讀取不成功,則不會輸入循環。