Declarations
template < class CharT, class Traits = std::char_traits<CharT> > class basic_scanner; typedef basic_scanner<char> scanner; #ifdef CLX_USE_WCHAR typedef basic_scanner<wchar_t> wscanner; #endif
Overview
scanner は,標準Cライブラリにおける scanf() や fscanf(),sscanf() と同様の機能を提供します.引数として指定された文字列や入力ストリーム(標準入力, ファイル,...)から渡される文字列を指定された書式に従って読み込みます. scanner も scanf() と同様に変換指定(% で始まる識別子)を含めることができますが, scanf() のように型修飾子(%d, %f,...)は存在せず,変換指定は必ず "s" で終了します.
読み込んだ文字列は,% 演算子,または () 演算子を用いて, ユーザが指定した変数に代入することができます.% 演算子は,scanner が読み込んだ順に代入します.一方,() 演算子は, 第一引数に指定された添え字に対応する文字列を代入します. どちらの演算子においても,文字列 <-> 数値変換には lexical_cast を用いています.また,() 演算子は,第 3 引数に Functor を指定することによって,独自の変換ルールを適用することもできます.
scanner は,TokenizerFunc として format_separator を用いた tokenizer を利用して実装しています.tokenizer や format_separator については, tokenizer を参照して下さい.
Example
#include <iostream> #include <string> #include "clx/scanner.h" #include "clx/lexical_cast.h" class my_assign { public: template <class ValueT> void operator()(const std::string& s, ValueT& dest) { dest = clx::lexical_cast<ValueT>(s) + 1000; } }; int main(int argc, char* argv[]) { std::string fmt = "%s/%s/%s %s:%s:%s"; std::string s = "2006/03/31 13:00:30"; int year, mon, day, hour, min, sec; // scan from string clx::scanner(s, fmt) % year % mon % day % hour % min % sec; std::cout << "Today is " << day << ' ' << mon << ", " << year << std::endl; hour = 0; min = 0; sec = 0; // scan from cin std::cout << "Date: "; clx::scanner(std::cin, fmt)(5, sec)(4, min)(3, hour, my_assign()); std::cout << "Now, it is " << hour << ':' << min << ':' << sec << std::endl; return 0; }
Result Today is 31 3, 2006 Date: 2006/03/31 15:44:00 Now, it is 1015:44:0
Template Parameters
- CharT
- 文字の型を指定します.
- Traits
- 文字列を扱うためのtraitsを指定します.デフォルト値は, std::char_traits<CharT>.
Related Types
typedef CharT char_type; typedef unsigned int size_type; typedef typename std::basic_string<CharT, Traits> string_type; typedef typename std::basic_istream<CharT, Traits> istream_type;
Construction and Member Functions
explicit basic_scanner(istream_type& sin, const char_type* fmt); explicit basic_scanner(istream_type& sin, const string_type& fmt); explicit basic_scanner(const char_type* src, const char_type* fmt); explicit basic_scanner(const string_type& src, const string_type& fmt); virtual ~basic_scanner(); template <class ValueT> basic_scanner& operator%(ValueT& dest); template <class ValueT> basic_scanner& operator()(size_type pos, ValueT& dest); template <class ValueT, class Assign> basic_scanner& operator()(size_type pos, ValueT& dest, Assign f);
% 演算子は,scanner が読み込んだ順に代入します.() 演算子は, 第一引数に指定された添え字に対応する文字列を代入します.また,() 演算子は,第 3 引数に Functor を指定することによって,独自の変換ルールを適用することもできます.