2010-11-20 4 views
2

stringループのすべての値をいくつかのデータ型に入力できるwhileループがありますか?stringstreamからの値の入力

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

答えて

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と評価されます。これがループをループの条件として使用できる理由です。

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

ストリームの最後に到達したとき(テストline.eof()と表示されます)のいずれかです。明らかに、ストリームからすべてのデータを読み込もうとしている場合は、これが完了したときにストリームが存在すると予想される条件です。

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

+0

私はそれにビート、私はまだ入力していた! '+ 1' – sbi

+0

' for(文字列;行>>もの;){use(物); } 'ループのいずれかで条件が満たされない場合、line.fail()はtrueになります。あなたはストリームがまだ壊れていないためにループを解除する必要があります。 !stream.fail()はstream.good()と同じではないため、良い(つまり、私は失敗しないと言う理由で)注意してください。 –

関連する問題