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 を指定することによって,独自の変換ルールを適用することもできます.