std::time_get<CharT,InputIt>::get, std::time_get<CharT,InputIt>::do_get
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <locale> で定義
|
||
public: iter_type get(iter_type beg, iter_type end, std::ios_base& str, std::ios_base::iostate& err, std::tm* t, const char_type* fmtbeg, const char_type* fmtend) const; |
(1) | (C++11以上) |
protected: virtual iter_type do_get(iter_type beg, iter_type end, std::ios_base& str, std::ios_base::iostate& err, std::tm *t, char format, char modifier) const; |
(2) | (C++11以上) |
1) 文字シーケンス
[fmtbeg, fmtend) に提供される書式に従って入力文字シーケンス [beg, end) から日付と時間を解析します。 書式は後述する書式に従うことが期待されますが、各書式指定子の実際の処理は do_get をオーバーライドすることによってカスタマイズできます。 get は以下のことを行います。
まず、 err = std::ios_base::goodbit を実行することによって err のエラービットをクリアします。 その後、以下の条件 (この順番でチェックされます) のいずれかが真になったときに終了する、ループに入ります。a) 書式文字列からすべての文字が読み込まれた (
fmtbeg == fmtend)。b) 解析エラーがあった (
err != std::ios_base::goodbit)。c) 入力シーケンスからすべての文字が読み込まれた (
beg == end)。 この条件でループを終了した場合、この関数は err に eofbit と failbit の両方をセットします。- ループの本体では、以下のステップが行われます。
a) 書式文字列の次の文字が
'%' で、有効な std::get_time の変換指定子 (後述) を形成する1文字または2文字が続く場合、これらの文字が do_get(beg, end, str, err, t, format, modifier) の呼び出しで使用されます。 ただし format は主変換指定子文字、 modifier はオプショナルな修飾子 (存在する場合は % と書式文字の間に現れます) です。 修飾子がない場合は、値 '\0' が使用されます。 書式文字列が曖昧な場合、または '%' の後の変換指定子を決定するより早く終了した場合は、 err に eofbit がセットされ、ループが終了されます。 do_get の呼び出し後、 err にエラービットがセットされていなければ、この関数は変換指定子の直後を指すように fmtbeg をインクリメントし、ループを継続します。b) ストリーム
str で提供されるロケールによって示されるところによれば次の文字がホワイトスペースである (すなわち std::isspace(*fmtbeg, str.getloc()) == true) 場合、この関数は fmtend と等しくなるか非ホワイトスペース文字を指すまで fmtbeg をインクリメントし続けます。c) 書式文字列の次の文字が入力ストリームの次の文字と大文字小文字を区別しない比較に従って同等であれば、この関数は両方のシーケンスを1文字進め (
++fmtbeg, ++beg;)、そうでなければ、 err に failbit をセットします。- まず、
err = std::ios_base::goodbitを実行することによってerrのエラービットをクリアします。 その後、'%'、modifier('\0'でない場合) およびformatを組み合わせることによって形成される std::time_get の書式指定子によって期待される入力シーケンス[beg, end)から文字を読み込みます。 文字が有効な変換指定子を形成するために組み合わせられない場合は、errにeofbitをセットします。 文字を読み込んだ後、入力ストリームの終端に達した場合は、errにeofbitをセットします。 入力文字列の解析に成功した場合は、*tの対応するフィールドを更新します。
- まず、
'%x'や'%c'などの複雑な変換指定子や、修飾子'E'および'O'を使用する指令については、この関数は*tに格納する値のいくつかを決定するのに失敗するかもしれません。 そのような場合は、errにeofbitをセットし、これらの状態を未規定な状態に置きます。
引数
| 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() を呼ぶ前にすべてのフィールドをゼロに初期化するべきです。
例
Run this code
#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) |
指定された書式の日付/時刻の値をパースします (関数テンプレート) |