2013-03-13 39 views
3

如何使用相同的stringstream對象標記兩個不同的字符串?如何使用相同的stringstream對象標記兩個不同的字符串?

我嘗試下面的代碼,但它不工作:

using namespace std; 

void check() 
{ 
     stringstream s("This is a test"); 
     string token; 

     while (s>>token) 
     { 
       cout<< token <<'\n'; 
     } 
     s.str("hello world"); 
     while (s>> token) 
     { 
       cout<< token <<'\n'; 
     } 
} 

int main() 
{ 
    check(); 
    int z; 
    cin>>z; 
} 
+2

當您在第一個while循環中用'>>'到達流的末尾時,會設置eof位。這就是爲什麼你需要調用clear()來重置流,如答案中所示。 – 2013-03-13 03:36:53

回答

3

你需要做s.clear();重置流標誌:當你到達

stringstream my_stringstream("This is a test"); 
string token; 

while (my_stringstream >> token) 
{ 
     cout<< token <<'\n'; 
} 

my_stringstream.str("hello world"); 
my_stringstream.clear(); 

while (my_stringstream >> token) 
{ 
     cout<< token <<'\n'; 
} 

的EOF位設置在第一個while循環中與>>流結束。這就是爲什麼你需要調用clear()來重置流,如答案中所示。
謝謝Jesse Good的補充。

+0

謝謝你,你幫了我很多 – user2163629 2013-03-13 15:26:50

0

這條線:

while (s >> token) 

...做了相當多的。以及從s獲得tokenoperator>>返回流(s)。 while然後通過converting it to either a bool (since C++11) or a void* (before C++11)評估這個s。這是本質上相同!fail()。現在,如果fail()返回true並且已經跳出第一個循環,則不會進入第二個循環,直到eofbit,badbit和/或failbit已被重置爲止。你有clear()重置這些,如下所示:

void check() 
{ 
    stringstream s("This is a test"); 
    string token; 

    while (s >> token) 
    { 
     cout << token << '\n'; 
    } 

    std::cerr << "Before s.clear(), s.fail() is " << std::boolalpha << s.fail() << std::endl; 

    s.clear(); 

    std::cerr << "After s.clear(), s.fail() is " << std::boolalpha << s.fail() << std::endl; 

    s.str("hello world"); 
    while (s >> token) 
    { 
     cout << token << '\n'; 
    } 
} 

See it run

相關問題