「boost::tokenizer」の版間の差分
提供: C++入門
(ページの作成:「<!-- vim: filetype=mediawiki --> 読み方 ;boost tokenizer: ぶーすと とーくないざー __TOC__ == 概要 == == ヘッダファイル == <syntaxhigh...」) |
細 (Daemon がページ「Boost::tokenizer」を「boost::tokenizer」に移動しました) |
||
(同じ利用者による、間の5版が非表示) | |||
行2: | 行2: | ||
vim: filetype=mediawiki | vim: filetype=mediawiki | ||
--> | --> | ||
+ | |||
+ | [[Boost::tokenizer]] は、文字列の切り出しを行うためのライブラリです。 | ||
読み方 | 読み方 | ||
− | ;[[boost tokenizer]]: ぶーすと とーくないざー | + | ;[[boost::tokenizer]]: ぶーすと とーくないざー |
__TOC__ | __TOC__ | ||
行11: | 行13: | ||
== 概要 == | == 概要 == | ||
+ | [[boost::tokenizer]] は、カンマで区切られた文字列から文字列を切り出すといった用途で利用されます。[[C言語]]でいう strtok() のようなものです。 | ||
+ | [[boost::tokenizer]] のほかに、 [[Boost::split]] もあります。 | ||
+ | |||
+ | [[C++]] で CSVファイルを扱うには、[[boost::tokenizerでCSVを読み込む]] を参考にしてください。 | ||
== ヘッダファイル == | == ヘッダファイル == | ||
行17: | 行23: | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
#include <boost/tokenizer.hpp> | #include <boost/tokenizer.hpp> | ||
+ | |||
+ | template < | ||
+ | class TokenizerFunc = char_delimiters_separator<char>, | ||
+ | class Iterator = std::string::const_iterator, | ||
+ | class Type = std::string | ||
+ | > | ||
+ | class tokenizer | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == ソースコード == | + | == boost::tokenizer を利用したシンプルな例 == |
+ | |||
+ | 文字列の前後の空白を削除し、セパレータが並んだ場合にも、空白エントリとして残さない例です。 | ||
+ | [[boost::split]] と [[boost::trim]] を組み合わせるよりも、簡単かもしれません。 | ||
+ | |||
+ | === ソースコード boost_tokenizer_simple1.cpp === | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <iostream> | ||
+ | #include <string> | ||
+ | #include <boost/tokenizer.hpp> | ||
+ | |||
+ | int | ||
+ | main(int argc, char const* argv[]) | ||
+ | { | ||
+ | |||
+ | std::string str1(" 1 \t2 3 "); | ||
+ | boost::tokenizer<> tokens(str1); | ||
+ | |||
+ | for (boost::tokenizer<>::iterator it = tokens.begin(); it != tokens.end(); ++it) { | ||
+ | std::cout << *it << std::endl; | ||
+ | } | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === コンパイル === | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | clang++ -I/usr/local/include boost_tokenizer_simple1.cpp -o boost_tokenizer_simple1 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === 実行例 === | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | % ./boost_tokenizer_simple1 | ||
+ | 1 | ||
+ | 2 | ||
+ | 3 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 複数のセパレータを利用したシンプルな例 == | ||
+ | |||
+ | 空のエントリは、残りません。 | ||
+ | |||
+ | === ソースコード boost_char_separator_1.cpp === | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
行31: | 行90: | ||
{ | { | ||
− | std::string str1("1,2,3,4,5"); | + | std::string str1(";;1,,,2,3;4|5|||"); |
+ | |||
+ | typedef boost::char_separator<char> BOOST_CHAR_SEP; | ||
+ | typedef boost::tokenizer< BOOST_CHAR_SEP > BOOST_TOKENIZER; | ||
+ | |||
+ | BOOST_CHAR_SEP sep(";,|"); | ||
+ | BOOST_TOKENIZER tokens(str1, sep); | ||
+ | |||
+ | BOOST_FOREACH(std::string s, tokens) { | ||
+ | std::cout << s << std::endl; | ||
+ | } | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === コンパイル === | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | clang++ -I/usr/local/include boost_char_separator_1.cpp -o boost_char_separator_1 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === 実行例 === | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | % ./boost_char_separator_1 | ||
+ | 1 | ||
+ | 2 | ||
+ | 3 | ||
+ | 4 | ||
+ | 5 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == char_separator を利用した空のエントリを残す例 == | ||
+ | |||
+ | === ソースコード boost_tokenizer.cpp === | ||
+ | |||
+ | boost::keep_empty_tokens によって、空のエントリが残ります。 | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <iostream> | ||
+ | #include <string> | ||
+ | #include <boost/tokenizer.hpp> | ||
+ | #include <boost/foreach.hpp> | ||
+ | |||
+ | int | ||
+ | main(int argc, char const* argv[]) | ||
+ | { | ||
+ | |||
+ | std::string str1("1,2,3,4,,5"); | ||
boost::char_separator<char> separator(",", "", boost::keep_empty_tokens); | boost::char_separator<char> separator(",", "", boost::keep_empty_tokens); | ||
行46: | 行154: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == コンパイル == | + | === コンパイル === |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
行52: | 行160: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == 実行例 == | + | === 実行例 === |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
行60: | 行168: | ||
3 | 3 | ||
4 | 4 | ||
+ | |||
5 | 5 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == デリミタを残す例 == | ||
+ | |||
+ | === ソースコード boost_char_separator_2.cpp === | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <iostream> | ||
+ | #include <string> | ||
+ | #include <boost/tokenizer.hpp> | ||
+ | #include <boost/foreach.hpp> | ||
+ | |||
+ | int | ||
+ | main(int argc, char const* argv[]) | ||
+ | { | ||
+ | |||
+ | std::string str1(";;1,,,2,3;4||5||"); | ||
+ | |||
+ | typedef boost::char_separator<char> BOOST_CHAR_SEP; | ||
+ | typedef boost::tokenizer< BOOST_CHAR_SEP > BOOST_TOKENIZER; | ||
+ | |||
+ | BOOST_CHAR_SEP sep(";,", "|", boost::keep_empty_tokens); | ||
+ | BOOST_TOKENIZER tokens(str1, sep); | ||
+ | |||
+ | BOOST_FOREACH(std::string s, tokens) { | ||
+ | std::cout << s << std::endl; | ||
+ | } | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === 実行例 === | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | % ./boost_char_separator_2 | ||
+ | |||
+ | |||
+ | 1 | ||
+ | |||
+ | |||
+ | 2 | ||
+ | 3 | ||
+ | 4 | ||
+ | | | ||
+ | |||
+ | | | ||
+ | 5 | ||
+ | | | ||
+ | |||
+ | | | ||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== 関連項目 == | == 関連項目 == | ||
− | * [[boost split]] | + | * [[boost::split]] |
− | * [[boost trim]] | + | * [[boost::trim]] |
* [[C++ライブラリ]] | * [[C++ライブラリ]] |
2013年3月23日 (土) 16:31時点における最新版
Boost::tokenizer は、文字列の切り出しを行うためのライブラリです。
読み方
- boost::tokenizer
- ぶーすと とーくないざー
目次
概要
boost::tokenizer は、カンマで区切られた文字列から文字列を切り出すといった用途で利用されます。C言語でいう strtok() のようなものです。
boost::tokenizer のほかに、 Boost::split もあります。
C++ で CSVファイルを扱うには、boost::tokenizerでCSVを読み込む を参考にしてください。
ヘッダファイル
#include <boost/tokenizer.hpp> template < class TokenizerFunc = char_delimiters_separator<char>, class Iterator = std::string::const_iterator, class Type = std::string > class tokenizer
boost::tokenizer を利用したシンプルな例
文字列の前後の空白を削除し、セパレータが並んだ場合にも、空白エントリとして残さない例です。 boost::split と boost::trim を組み合わせるよりも、簡単かもしれません。
ソースコード boost_tokenizer_simple1.cpp
#include <iostream> #include <string> #include <boost/tokenizer.hpp> int main(int argc, char const* argv[]) { std::string str1(" 1 \t2 3 "); boost::tokenizer<> tokens(str1); for (boost::tokenizer<>::iterator it = tokens.begin(); it != tokens.end(); ++it) { std::cout << *it << std::endl; } return 0; }
コンパイル
clang++ -I/usr/local/include boost_tokenizer_simple1.cpp -o boost_tokenizer_simple1
実行例
% ./boost_tokenizer_simple1 1 2 3
複数のセパレータを利用したシンプルな例
空のエントリは、残りません。
ソースコード boost_char_separator_1.cpp
#include <iostream> #include <string> #include <boost/tokenizer.hpp> #include <boost/foreach.hpp> int main(int argc, char const* argv[]) { std::string str1(";;1,,,2,3;4|5|||"); typedef boost::char_separator<char> BOOST_CHAR_SEP; typedef boost::tokenizer< BOOST_CHAR_SEP > BOOST_TOKENIZER; BOOST_CHAR_SEP sep(";,|"); BOOST_TOKENIZER tokens(str1, sep); BOOST_FOREACH(std::string s, tokens) { std::cout << s << std::endl; } return 0; }
コンパイル
clang++ -I/usr/local/include boost_char_separator_1.cpp -o boost_char_separator_1
実行例
% ./boost_char_separator_1 1 2 3 4 5
char_separator を利用した空のエントリを残す例
ソースコード boost_tokenizer.cpp
boost::keep_empty_tokens によって、空のエントリが残ります。
#include <iostream> #include <string> #include <boost/tokenizer.hpp> #include <boost/foreach.hpp> int main(int argc, char const* argv[]) { std::string str1("1,2,3,4,,5"); boost::char_separator<char> separator(",", "", boost::keep_empty_tokens); boost::tokenizer< boost::char_separator<char> > tokens(str1, separator); BOOST_FOREACH(std::string s, tokens) { std::cout << s << std::endl; } return 0; }
コンパイル
clang++ -I/usr/local/include boost_tokenizer.cpp -o boost_tokenizer
実行例
% ./boost_tokenizer 1 2 3 4 5
デリミタを残す例
ソースコード boost_char_separator_2.cpp
#include <iostream> #include <string> #include <boost/tokenizer.hpp> #include <boost/foreach.hpp> int main(int argc, char const* argv[]) { std::string str1(";;1,,,2,3;4||5||"); typedef boost::char_separator<char> BOOST_CHAR_SEP; typedef boost::tokenizer< BOOST_CHAR_SEP > BOOST_TOKENIZER; BOOST_CHAR_SEP sep(";,", "|", boost::keep_empty_tokens); BOOST_TOKENIZER tokens(str1, sep); BOOST_FOREACH(std::string s, tokens) { std::cout << s << std::endl; } return 0; }
実行例
% ./boost_char_separator_2 1 2 3 4 | | 5 | |