stringループのすべての値をいくつかのデータ型に入力できるwhileループがありますか?stringstreamからの値の入力
stringstream line;
while(/*there's still stuff in line*/)
{
string thing;
line >> thing;
//do stuff with thing
}
stringループのすべての値をいくつかのデータ型に入力できるwhileループがありますか?stringstreamからの値の入力
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
と評価されます。これがループをループの条件として使用できる理由です。
ストリームが良好な状態にならない理由はいくつかあります。
ストリームの最後に到達したとき(テストline.eof()
と表示されます)のいずれかです。明らかに、ストリームからすべてのデータを読み込もうとしている場合は、これが完了したときにストリームが存在すると予想される条件です。
ストリームが良好な状態にならない他の2つの理由は、何らかの内部エラーまたはストリームの操作が失敗した場合です(たとえば、整数を抽出しようとしたがストリームの次のデータが整数を表す)。両方ともline.fail()
でテストされています。
私はそれにビート、私はまだ入力していた! '+ 1' – sbi
' for(文字列;行>>もの;){use(物); } 'ループのいずれかで条件が満たされない場合、line.fail()はtrueになります。あなたはストリームがまだ壊れていないためにループを解除する必要があります。 !stream.fail()はstream.good()と同じではないため、良い(つまり、私は失敗しないと言う理由で)注意してください。 –