std::time_get<CharT,InputIt>::get, std::time_get<CharT,InputIt>::do_get
ヘッダ <locale> で定義
|
||
public: iter_type get(iter_type beg, iter_type end, std::ios_base& str, |
(1) | (C++11以上) |
protected: virtual iter_type do_get(iter_type beg, iter_type end, std::ios_base& str, |
(2) | (C++11以上) |
[beg, end)
から日付と時間を解析します。 書式は後述する書式に従うことが期待されますが、各書式指定子の実際の処理は do_get
をオーバーライドすることによってカスタマイズできます。 get
は以下のことを行います。
まず、 err = std::ios_base::goodbit を実行することによって err
のエラービットをクリアします。 その後、以下の条件 (この順番でチェックされます) のいずれかが真になったときに終了する、ループに入ります。err
に eofbit
と failbit
の両方をセットします。- ループの本体では、以下のステップが行われます。
format
は主変換指定子文字、 modifier
はオプショナルな修飾子 (存在する場合は %
と書式文字の間に現れます) です。 修飾子がない場合は、値 '\0' が使用されます。 書式文字列が曖昧な場合、または '%' の後の変換指定子を決定するより早く終了した場合は、 err
に eofbit
がセットされ、ループが終了されます。 do_get
の呼び出し後、 err
にエラービットがセットされていなければ、この関数は変換指定子の直後を指すように fmtbeg
をインクリメントし、ループを継続します。str
で提供されるロケールによって示されるところによれば次の文字がホワイトスペースである (すなわち std::isspace(*fmtbeg, str.getloc()) == true) 場合、この関数は fmtend
と等しくなるか非ホワイトスペース文字を指すまで fmtbeg
をインクリメントし続けます。err
に failbit
をセットします。- まず、 err = std::ios_base::goodbit を実行することによって
err
のエラービットをクリアします。 その後、 '%'、modifier
('\0' でない場合) およびformat
を組み合わせることによって形成される std::time_get の書式指定子によって期待される入力シーケンス[beg, end)
から文字を読み込みます。 文字が有効な変換指定子を形成するために組み合わせられない場合は、err
にeofbit
をセットします。 文字を読み込んだ後、入力ストリームの終端に達した場合は、err
にeofbit
をセットします。 入力文字列の解析に成功した場合は、 *t の対応するフィールドを更新します。
- まず、 err = std::ios_base::goodbit を実行することによって
- '%x' や '%c' などの複雑な変換指定子や、修飾子 'E' および 'O' を使用する指令については、この関数は *t に格納する値のいくつかを決定するのに失敗するかもしれません。 そのような場合は、
err
にeofbit
をセットし、これらの状態を未規定な状態に置きます。
- '%x' や '%c' などの複雑な変換指定子や、修飾子 'E' および 'O' を使用する指令については、この関数は *t に格納する値のいくつかを決定するのに失敗するかもしれません。 そのような場合は、
目次 |
[編集] 引数
beg | - | 解析するシーケンスの開始を指定するイテレータ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | - | 解析するシーケンスの終端イテレータ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
str | - | 必要なときにロケールのファセットを取得するためにこの関数が使用するストリームオブジェクト (例えばホワイトスペースをスキップするための std::ctype や文字列を比較するための std::collate) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
err | - | エラーを示すためにこの関数によって変更されるストリームエラーフラグオブジェクト | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t | - | この関数呼び出しの結果を保持する std::tm オブジェクトへのポインタ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmtbeg | - | 変換の書式を指定する char_type 文字のシーケンスの最初の文字へのポインタ。
書式文字列はゼロ個以上の変換指定子、ホワイトスペース、および (
ノート:
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmtend | - | 変換の書式を指定する char_type 文字のシーケンスの最後の文字の次へのポインタ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
format | - | 変換指定子の名前の文字 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
modifier | - | % と変換指定子の間に現れるかもしれないオプショナルな修飾子
|
[編集] 戻り値
解析に成功した [beg, end)
内の最後の文字の次を指すイテレータ。
[編集] ノート
書式文字列内のホワイトスペースでなく '%' でない文字に対する大文字小文字を区別しない比較は、必ずではありませんが、一般的には、 str
によって提供されるロケールの std::collate ファセットが使用されます。
解析エラーに遭遇した場合、この関数の多くの実装は *t
にまったく触りません。
これらの関数が直接設定しない *t 内のフィールドをゼロクリアするかどうかは未規定です。 移植性のあるプログラムは get()
を呼ぶ前にすべてのフィールドをゼロに初期化するべきです。
[編集] 例
#include <iostream> #include <sstream> #include <locale> #include <iomanip> int main() { std::istringstream ss("2011-Februar-18 23:12:34"); ss.imbue(std::locale("de_DE.utf8")); auto& f = std::use_facet<std::time_get<char>>(std::locale("de_DE.utf8")); std::tm t{}; std::string s = "%Y-%b-%d %H:%M:%S"; std::ios_base::iostate err = std::ios_base::goodbit; auto ret = f.get({ss}, {}, ss, err, &t, &s[0], &s[0] + s.size()); ss.setstate(err); std::istreambuf_iterator<char> last{}; if(ss) { std::cout << "Successfully parsed as " << std::put_time(&t, "%c"); if(ret != last) { std::cout << " Remaining content: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } else { std::cout << " The input was fully consumed"; } } else { std::cout << "Parse failed. Unparsed string: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } std::cout << '\n'; }
出力:
Successfully parsed, as Sun Feb 18 23:12:34 2011 The input was fully consumed
[編集] 関連項目
(C++11) |
指定された書式の日付/時刻の値をパースします (関数テンプレート) |