あなたの場合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 を使用する他の 2 つの選択肢があります。
文字列アルゴリズム:
#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
ではない何かで停止し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;
}