In Ihrem Fall ist es ausreichend, getline
in der gleichen Art und Weise zu verwenden, wie Sie in der äußeren Schleife zu tun:
while(getline(tokenizer, token, ','))
Während die meisten wahrscheinlich würde ich so etwas tun:
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;
}
Und zwei andere Alternativen - die Boost nutzen.
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(","));
oder 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;
Wenn Sie nicht int
, nicht-Trennzeichen zu begegnen erwarten, z.B. 1 3 2 XXXX 4
. Dann müssen Sie entscheiden, was in einem solchen Fall zu tun ist. tokenizer >> number
stoppt bei etwas, das nicht int
ist und die istringstream
Fehler Flags werden gesetzt. boost::lexical_cast
ist auch dein Freund:
#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;
}
schließlich in C++ 11 Sie haben die stoi/stol/stoll Funktionen:
#include <iostream>
#include <string>
int main()
{
std::string test = "1234";
std::cout << std::stoi(str) << std::endl;
}
Dieser Code druckt nur eine Nummer ...... – howtechstuffworks
@howtechstuffworks: Fest, das tut mir leid. – Anonymous