文字列ストリームのすべての値をデータ型に入力できるwhileループはありますか?例えば:
stringstream line;
while(/*there's still stuff in line*/)
{
string thing;
line >> thing;
//do stuff with thing
}
文字列ストリームのすべての値をデータ型に入力できるwhileループはありますか?例えば:
stringstream line;
while(/*there's still stuff in line*/)
{
string thing;
line >> thing;
//do stuff with thing
}
はい:
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()
ます。