CLX C++ Libraries
Home >> scanner

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

example_scanner.cpp

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

Related Pages

  1. CLX C++ Libraries - tokenizer
  2. CLX C++ Libraries - tokenizer_func