std :: stringstream: ищет совета - PullRequest
0 голосов
/ 11 января 2019

Ниже приведен фрагмент тестового кода, который я написал, чтобы проверить мое понимание того, как работает stringstream:

#include<iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>

using std::cout;
using std::endl;
using std::vector;
using std::string;
using std::stringstream;
using std::for_each;

int main (void){

   string s1 = "5";
   string s2 = "1 4 -1 6 0";
   vector<int> v;
   int val = 0;

   stringstream ss(s1);
   ss >> val;
   cout << "val: " << val << endl;

   ss.str(s2);
   while(val > 0){
      ss >> val;
      cout << "val: " << val << endl;
      v.push_back(val);
   }
   for_each(v.begin(), v.end(), [](int& i){cout << i << endl;});

   return 0;
}

Когда код скомпилирован:

g ++ -ggdb -std = c ++ 14 -Wall <filename.cpp>

и запустите, значение s1 извлекается и вводится в val.

Во втором случае попытка последовательно извлечь из s2 и ввести в val не работает. val сохраняет значение, введенное в него из s1, и, следовательно, цикл работает бесконечно. Условие проверки цикла, т.е. val > 0, основано на следующем:

Если извлечение завершается неудачно, в значение записывается ноль, и бит сбоя устанавливается.

Ссылка: std :: basic_istream :: operator >>

Что мне здесь не хватает?

ТИА

1 Ответ

0 голосов
/ 11 января 2019

Что мне здесь не хватает?

Добавьте ss.clear(); перед строкой ss.str(s2);, чтобы сбросить здесь флаги ошибок EOF, установленный ss >> val;

После исполнения выдаст:

val: 5
val: 1
val: 4
val: -1
1
4
-1
...