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。
字符串算法:
#include <boost/algorithm/string.hpp>
...
std::vector<std::string> strings;
boost::split(strings, "1,3,4,5,6,2", boost::is_any_of(","));
或标记器:
#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
将停在不是 an 的地方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;
}