3

如何用相同的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;
}
4

2 回答 2

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';
}

>>当您在第一个 while 循环中到达流的末尾时,将设置 eof 位。这就是为什么您需要调用 clear() 来重置流,如答案所示。
感谢 Jesse Good 的补充。

于 2013-03-13T03:29:33.973 回答
0

这一行:

while (s >> token)

......相当多。除了获取tokenfrom之外soperator>>还返回流 ( s)。while然后s通过将其转换为 a bool(since C++11) 或 a void*(before C++11)来评估它。这!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';
    }
}

看它跑

于 2013-03-13T03:37:34.670 回答