То, что вы опубликовали, работает вместе с решением Джеремии Уилкока, используя вместо этого istringstream
. Но рассмотрите возможность использования семейства функций scanf (всего для пары целых чисел это не имеет большого значения, но для более сложного ввода использование 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
несколько раз, но вам придется либо каждый раз полностью использовать буфер, либо понимать, что в буфере есть еще что-то, прежде чем следующий элемент вставляется в буфер:
* * 1010
Кроме того, 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;
}