В вашем случае достаточно использовать getline
таким же образом, как вы делаете во внешнем контуре:
while(getline(tokenizer, token, ','))
Хотя, скорее всего, я хотел бы сделать что-то вроде этого:
while(std::getline(read,line)) { // read line by line
std::replace(line.begin(), line.end(), ',', ' '); // get rid of commas
std::istringstream tokenizer(line);
int number;
while(tokenizer >> number) // read the ints
std::cout<<number<<std::endl;
}
И еще две альтернативы - использование Boost.
String Algorithms:
#include <boost/algorithm/string.hpp>
...
std::vector<std::string> strings;
boost::split(strings, "1,3,4,5,6,2", boost::is_any_of(","));
или tokenizer:
#include <boost/tokenizer.hpp>
typedef boost::char_separator<char> separator_t;
typedef boost::tokenizer<separator_t> tokenizer_t;
...
tokenizer_t tokens(line, sep);
for(tokenizer_t::iterator it = tokens.begin(); it != tokens.end(); ++it)
std::cout << *it << std::endl;
Если вы ожидаете встретить Непро- символов int
, не разделителей, например, 1 3 2 XXXX 4
. Тогда вам придется решить, что делать в таком случае. tokenizer >> number
остановится на то, что не является int
, и будут установлены флаги ошибок istringstream
. boost::lexical_cast
также ваш друг:
#include <boost/lexical_cast.hpp>
...
try
{
int x = boost::lexical_cast<int>("1a23");
}
catch(const boost::bad_lexical_cast &)
{
std::cout << "Error: input string was not valid" << std::endl;
}
Наконец, в C++ 11 вы имеете stoi/stol/stoll функции:
#include <iostream>
#include <string>
int main()
{
std::string test = "1234";
std::cout << std::stoi(str) << std::endl;
}
Этот код печатает только один номер ...... – howtechstuffworks
@howtechstuffworks: Фиксированный, простите за это. – Anonymous