3

stringstream同じオブジェクトで2つの異なる文字列をトークン化するにはどうすればよいですか?

次のコードを試しましたが、機能しません。

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() を呼び出してストリームをリセットする必要があります。
追加してくれてありがとうジェシーグッド。

于 2013-03-13T03:29:33.973 に答える
0

この行:

while (s >> token)

...かなり多くのことを行います。tokenfromを取得するだけでなくsoperator>>はストリーム ( s) を返します。while次に、これを a (C++11以降) または a (C++11より前)に変換してs評価します。これは基本的に と同じです。ここで、が戻って最初のループから抜け出した場合、 、および/またはリセットされるまで、2 番目のループに入ることはありません。以下に示すように、これらを でリセットします。boolvoid*!fail()fail()trueeofbitbadbitfailbitclear()

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 に答える