あなたが投稿したものは、istringstream
代わりに使用するJeremiah Willcockのソリューションとともに機能します。ただし、関数のscanfファミリも使用することを検討してください (int の数だけでは大きな違いはありませんが、より高度な入力では、scanf を使用すると、ストリーム マニピュレータをいじるよりもはるかに簡潔になります)。
string things = "10 11 12 -10";
int i1, i2, i3, i4, i5, i6;
sscanf(things.c_str(), "%d %d %d %d", &i1, &i2, &i3, &i4);
あなたの例がその後0を与える理由はstringstream
、-10を抽出するとバッファが空になるためです。さらに抽出する前に、バッファにさらに挿入する必要があります。同じstringstream
インスタンスを複数回使用できますが、毎回バッファーを完全に使用するか、次のアイテムをバッファーに挿入する前にバッファーにさらに多くのアイテムがあることに気付く必要があります。
string things = "10 11 12 -10", temp;
int i1, i2, i3, i4;
stringstream into;
into << things; //buffer is now "10 11 12 -10"
into >> i1; //buffer is now " 11 12 -10"
into >> i2; //" 12 -10"
into >> i3; //" -10"
into >> i4; //""
//more code here...
//come back and use the instance again
into << "more: 1 2 3"; //"more: 1 2 3"
into >> temp; //temp is "more:"; into's buffer is " 1 2 3"
into >> i1; //buffer is " 2 3"
//more code here...
//reuse into once again
into << "4 5 6"; // buffer is now " 2 3 4 5 6"
into >> i1; //i1 gets the 2 from before, not the 4 just inserted; buffer now " 3 4 5 6"
into >> i2; //i2==3; buffer is " 4 5 6"
また、ios
(継承元)演算子とキャストstringstream
も定義して、抽出が失敗したかどうかを簡単に確認できるようにします(またはが設定されているかどうかを技術的にチェックします。バッファに十分な量がない場合に一緒に設定されると思います):!
void*
failbit
badbit
failbit
eofbit
string things = "10 11 12 -10";
int i1, i2, i3, i4;
stringstream into;
into << things;
into >> i1 >> i2 >> i3 >> i4;
if (into >> i5) {
cout << "extraction to i5 succeeded" << endl;
}
if (!(into >> i6)) {
cout << "extraction to i6 failed" << endl;
}