2

文字列ストリームのすべての値をデータ型に入力できるwhileループはありますか?例えば:

stringstream line;
while(/*there's still stuff in line*/)
{
    string thing;
    line >> thing;
    //do stuff with thing
}
4

1 に答える 1

2

はい:

std::stringstream line;
std::string thing;
while (line >> thing)
{
    // do stuff with thing
}

if (line.fail())
{
    // an error occurred; handle it as appropriate
}

ストリーム操作(のような>>)はストリームを返します。これにより、次のようなストリーム操作を連鎖させることができます。

line >> x >> y >> z

ストリームはブール値として使用できます。ストリームが良好な状態にある場合(つまり、ストリームからデータを読み取ることができる場合)、ストリームはtrue;と評価されます。それ以外の場合は、と評価されfalseます。これが、ストリームをループの条件として使用できる理由です。

ストリームが良好な状態にならない理由はいくつかあります。

それらの1つは、ストリームの最後に到達したときです(テストによって示されますline.eof())。明らかに、ストリームからすべてのデータを読み取ろうとしている場合、これは、完了時にストリームが存在すると予想される状態です。

ストリームが良好な状態にならない他の2つの理由は、内部エラーがある場合、またはストリームの操作が失敗した場合です(たとえば、整数を抽出しようとしたが、ストリーム内の次のデータが整数を表していない場合)。 。これらは両方ともによってテストされていline.fail()ます。

于 2010-11-20T21:43:51.123 に答える