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以降) |
do_get をオーバーライドすることでカスタマイズできます。get 関数は以下の処理を行います。まず、err = std::ios_base::goodbit を実行して err のエラービットをクリアします。次にループに入り、以下のいずれかの条件が真になるとループが終了します(この順序でチェックされます)。err に eofbit と failbit の両方を設定します。- ループ本体では、以下のステップが実行されます。
do_get(beg, end, str, err, t, format, modifier) の呼び出しで使用されます。ここで format は主要な変換指定子文字、modifier はオプションの修飾子(存在する場合、% とフォーマット文字の間に現れます)です。修飾子がない場合は、値 '\0' が使用されます。フォーマット文字列が曖昧であるか、'%' の後に変換指定子を決定するには早すぎる場合、eofbit が err に設定され、ループは終了します。do_get の呼び出し後、err にエラービットが設定されていない場合、関数は変換指定子の直後を指すように fmtbeg をインクリメントし、ループを続行します。failbit を設定します。- まず、err = std::ios_base::goodbit を実行して err のエラービットをクリアします。次に、入力シーケンス [beg, end) から、'%'、modifier('\0' でない場合)、および format を組み合わせて形成される std::time_get フォーマット指定子によって期待される文字を読み取ります。文字が有効な変換指定子を形成しない場合、err に
failbitを設定します。入力ストリームの末尾に文字を読み取った後に到達した場合、err にeofbitを設定します。入力文字列が正常に解析された場合、*t の対応するフィールドを更新します。
- まず、err = std::ios_base::goodbit を実行して err のエラービットをクリアします。次に、入力シーケンス [beg, end) から、'%'、modifier('\0' でない場合)、および format を組み合わせて形成される std::time_get フォーマット指定子によって期待される文字を読み取ります。文字が有効な変換指定子を形成しない場合、err に
- 複雑な変換指定子(例: '%x' または '%c')や、修飾子 'E' および 'O' を使用するディレクティブの場合、関数は *t に格納する一部の値の決定に失敗する可能性があります。この場合、err に
eofbitを設定し、これらのフィールドは未指定の状態のままにします。
- 複雑な変換指定子(例: '%x' または '%c')や、修飾子 'E' および 'O' を使用するディレクティブの場合、関数は *t に格納する一部の値の決定に失敗する可能性があります。この場合、err に
目次 |
[編集] パラメーター
| beg | - | 解析するシーケンスの開始を示すイテレータ |
| end | - | 解析するシーケンスの終了の次のイテレータ |
| str | - | 必要に応じてロケールファセット(例えば、空白をスキップするための std::ctype や文字列を比較するための std::collate)を取得するためにこの関数が使用するストリームオブジェクト |
| err | - | この関数によってエラーを示すために変更されるストリームエラーフラグオブジェクト |
| t | - | この関数の呼び出しの結果を保持する std::tm オブジェクトへのポインタ |
| fmtbeg | - | 変換フォーマットを指定する char_type 文字のシーケンスの最初の文字へのポインター(下記参照) |
| fmtend | - | 変換フォーマットを指定する char_type 文字のシーケンスの最後の文字の次の文字へのポインター |
| format | - | 変換指定子を名前付ける文字 |
| modifier | - | % と変換指定子の間に現れる可能性のあるオプションの修飾子 |
フォーマット文字列は、ゼロ個以上の変換指定子、空白文字、および通常の文字(% を除く)で構成されます。各通常の文字は、大文字・小文字を区別しない比較で、入力ストリームの 1 文字と一致することが期待されます。各空白文字は、入力文字列内の任意の空白文字に一致します。各変換指定子は % 文字で始まり、オプションで E または O 修飾子が続き(ロケールでサポートされていない場合は無視されます)、指定子の動作を決定する文字が続きます。フォーマット指定子は POSIX 関数 strptime() に一致します。
| 変換 指定子 |
説明 | フィールドへの書き込み |
|---|---|---|
%
|
リテラルの % に一致します。完全な変換指定子は %% でなければなりません。 |
(なし) |
t
|
任意の空白文字に一致します。 | (なし) |
n
|
任意の空白文字に一致します。 | (なし) |
| 年 | ||
Y
|
4桁の 10 進数として**年**を解析します。先頭のゼロは許可されますが、必須ではありません。 | tm_year
|
EY
|
ja_JP ロケールで、平成23年(西暦2011年)のような代替表現で**年**を解析します。 | tm_year
|
y
|
年の下 2 桁を 10 進数として解析します。範囲 [69,99] は 1969年から1999年、範囲 [00,68] は 2000年から2068年になります。 |
tm_year
|
Oy
|
年の下 2 桁を代替数値システムを使用して解析します。例: ja_JP ロケールで十(じゅう)を 10 として解析します。 | tm_year
|
Ey
|
ロケールの代替暦期間 %EC からのオフセットとして**年**を解析します。 |
tm_year
|
C
|
年の最初の 2 桁を 10 進数として解析します(範囲 [00,99])。 |
tm_year
|
EC
|
ja_JP ロケールで、平成(Heisei era)のような、ロケールの代替表現での基準年(期間)の名前を解析します。 | tm_year
|
| 月 | ||
b
|
完全な、または省略された月名を解析します。例: Oct。 |
tm_mon
|
h
|
b の同義語です。 |
tm_mon
|
B
|
b の同義語です。 |
tm_mon
|
m
|
10 進数として**月**を解析します(範囲 [01,12])。先頭のゼロは許可されますが、必須ではありません。 |
tm_mon
|
Om
|
ja_JP ロケールで、十二(じゅうに)を 12 として解析するような、代替数値システムを使用して**月**を解析します。 | tm_mon
|
| 週 | ||
U
|
10 進数として**年の週**を解析します(日曜日が週の最初の曜日)(範囲 [00,53])。先頭のゼロは許可されますが、必須ではありません。 |
tm_year、tm_wday、tm_yday |
OU
|
ja_JP ロケールで、五十二(ごじゅうに)を 52 として解析するような、代替数値システムを使用した**年の週**(%U のように)を解析します。 |
tm_year、tm_wday、tm_yday |
W
|
10 進数として**年の週**を解析します(月曜日が週の最初の曜日)(範囲 [00,53])。先頭のゼロは許可されますが、必須ではありません。 |
tm_year、tm_wday、tm_yday |
OW
|
ja_JP ロケールで、五十二(ごじゅうに)を 52 として解析するような、代替数値システムを使用した**年の週**(%W のように)を解析します。 |
tm_year、tm_wday、tm_yday |
| 年の日/月 | ||
j
|
10 進数として**年の日数**を解析します(範囲 [001,366])。先頭のゼロは許可されますが、必須ではありません。 |
tm_yday
|
d
|
10 進数として**月の日の数**を解析します(範囲 [01,31])。先頭のゼロは許可されますが、必須ではありません。 |
tm_mday
|
Od
|
ja_JP ロケールで、二十七(にじゅうしち)を 27 として解析するような、代替数値システムを使用して**月の日の数**を解析します。先頭のゼロは許可されますが、必須ではありません。 | tm_mday
|
e
|
d の同義語です。 |
tm_mday
|
Oe
|
Od の同義語です。 |
tm_mday
|
| 曜日 | ||
a
|
曜日名(完全な、または省略された)を解析します。例: Fri。 |
tm_wday
|
A
|
a の同義語です。 |
tm_wday
|
w
|
曜日を 10 進数として解析します。日曜日が 0 です(範囲 [0-6])。 |
tm_wday
|
Ow
|
ja_JP ロケールで、二(に)を 2 として解析するような、代替数値システムを使用して曜日を 10 進数として解析します。日曜日が 0 です。 |
tm_wday
|
| 時、分、秒 | ||
H
|
24 時間制の**時**を 10 進数として解析します(範囲 [00-23])。先頭のゼロは許可されますが、必須ではありません。 |
tm_hour
|
OH
|
ja_JP ロケールで、十八(じゅうはち)を 18 として解析するような、代替数値システムを使用して 24 時間制の**時**を解析します。 | tm_hour
|
I
|
12 時間制の**時**を 10 進数として解析します(範囲 [01,12])。先頭のゼロは許可されますが、必須ではありません。 |
tm_hour
|
OI
|
ja_JP ロケールで、六(ろく)を 06 として解析するような、代替数値システムを使用して 12 時間制の**時**を解析します。 | tm_hour
|
M
|
10 進数として**分**を解析します(範囲 [00,59])。先頭のゼロは許可されますが、必須ではありません。 |
tm_min
|
OM
|
ja_JP ロケールで、二十五(にじゅうご)を 25 として解析するような、代替数値システムを使用して**分**を解析します。 | tm_min
|
S
|
10 進数として**秒**を解析します(範囲 [00,60])。先頭のゼロは許可されますが、必須ではありません。 |
tm_sec
|
OS
|
ja_JP ロケールで、二十四(にじゅうし)を 24 として解析するような、代替数値システムを使用して**秒**を解析します。 | tm_sec
|
| その他 | ||
c
|
ja_JP ロケールのような、ロケールの標準的な日付と時刻の文字列フォーマットを解析します。例: Sun Oct 17 04:41:13 2010(ロケール依存)。 |
すべて |
Ec
|
ja_JP ロケールで、2011年(西暦2011年)の代わりに平成23年(西暦2011年)を期待するような、ロケールの代替日付と時刻の文字列フォーマットを解析します。 | すべて |
x
|
ロケールの標準的な日付表現を解析します。 | すべて |
Ex
|
ja_JP ロケールで、2011年(西暦2011年)の代わりに平成23年(西暦2011年)を期待するような、ロケールの代替日付表現を解析します。 | すべて |
X
|
ロケールの標準的な時刻表現を解析します。 | すべて |
EX
|
ロケールの代替時刻表現を解析します。 | すべて |
D
|
"%m / %d / %y " に相当します。 | tm_mon、tm_mday、tm_year |
r
|
POSIX では "%I : %M : %S %p" のような、ロケールの標準的な 12 時間制時刻を解析します。 | tm_hour、tm_min、tm_sec |
R
|
"%H : %M" に相当します。 | tm_hour、tm_min |
T
|
"%H : %M : %S" に相当します。 | tm_hour、tm_min、tm_sec |
p
|
ロケールにおける **a.m. または p.m.** に相当するものを解析します。 | tm_hour
|
注: tm_isdst は書き込まれず、mktime のような関数で使用するには明示的に設定する必要があります。
[編集] 戻り値
[beg, end) の中で正常に解析された最後の文字の次の文字を指すイテレーター。
[編集] 注釈
フォーマット文字列内の空白文字でも '%' でもない文字の大文字・小文字を区別しない比較では、通常、str によって提供されるロケールの std::collate フェセットが使用されますが、必須ではありません。
解析エラーが発生した場合、この関数の多くの実装では *t は完全に変更されません。
これらの関数が、直接設定しない *t のフィールドをゼロクリアするかどうかは未指定です。移植可能なプログラムは、get() を呼び出す前にすべてのフィールドをゼロに初期化する必要があります。
[編集] 例
#include <iomanip> #include <iostream> #include <locale> #include <sstream> int main() { std::istringstream ss("2026-März-12 23:45:56"); ss.imbue(std::locale("de_DE.utf8")); auto& f = std::use_facet<std::time_get<char>>(ss.getloc()); 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") << '\n'; 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.\nUnparsed string: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } std::cout << '\n'; }
出力
Successfully parsed as Sun Mar 12 23:45:56 2026 The input was fully consumed.
[編集] 関連項目
| (C++11) |
指定されたフォーマットの日付/時刻の値を構文解析する (関数テンプレート) |