Причина того, что вы испытываете, состоит в том, что EOF_BIT будет установлен в ss
после считывания первого значения в temp
, после чего никакие операции чтения / записи в std::stringstream
и, следовательно, temp
невозможны. не обновляется с новым значением.
Более понятный человеку способ объяснения вышесказанного; std :: stringstream ss
будет думать, что он достиг конца (который он имеет в какой-то момент). Вам нужно будет указать, что он должен начинаться заново (сбросить все флаги ошибок), чтобы его можно было использовать в другой итерации.
Как мне решить эту проблему?
Существует несколько доступных методов, для меня наиболее понятным (в отношении читабельности кода) является использование нового std::stringstream
для каждого итератора в цикле (см. " Пример решения # 2 ).
Обратите внимание на фрагменты ниже, которые все будут выводить:
2
3
5
7
11
13
17
Пример решения # 1
int const PRIMES_SIZE = 7;
int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};
std::stringstream ss;
std::string temp;
for (int i =0; i < PRIMES_SIZE; ++i) {
ss << primes[i];
ss >> temp;
std::cout << temp << std::endl;
ss.clear (); // unset error flags
}
Пример решения # 2
int const PRIMES_SIZE = 7;
int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};
for (int i =0; i < PRIMES_SIZE; ++i) {
std::stringstream ss;
ss << primes[i];
std::cout << ss.str () << std::endl;
}
Пример решения # 3
#include <iterator>
...
int const PRIMES_SIZE = 7;
int const primes[PRIMES_SIZE] = {2,3,5,7,11,13,17};
std::stringstream ss;
std::copy (primes, primes+PRIMES_SIZE, std::ostream_iterator<int> (ss, "\n"));
std::cout << ss.str ();