CLX C++ Libraries - scanner
Author: clown

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