2013-03-13 37 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

相关问题