namespace std {
template <class CharT>
unspecified get_time(struct tm* tmb, const CharT* fmt); // (1) C++11
}
概要
日時書式から入力する。
要件
tmbは、有効なtm型オブジェクトを指すポインタであること。fmtは、char_traits<CharT>::length(fmt)個の要素を持つ、有効なCharT型の配列を指すポインタであること。
戻り値
未規定の型のオブジェクトを返す。inをbasic_istream<CharT, Traits>型のオブジェクトとして、式in >> get_time(tmb, fmt)は以下の関数fをf(in, tmb, fmt)と呼び出したかのように振る舞う:
template <class CharT, class Traits>
void f(basic_ios<CharT, Traits>& str, struct tm* tmb, const CharT* fmt)
{
using Iter = istreambuf_iterator<CharT, Traits>;
using TimeGet = time_get<CharT, Iter>;
ios_base::iostate err = ios_base::goodbit;
const TimeGet& tg = use_facet<TimeGet>(str.getloc());
tg.get(Iter(str.rdbuf()), Iter(), str, err, tmb,
fmt, fmt + Traits::length(fmt));
if (err != ios_base::goodbit)
str.setstate(err);
}
式in >> get_time(tmb, fmt)は、basic_istream<CharT, Traits>&型を持ち、その値はinである。
備考
fmtに指定する書式はstd::strftime()と同じものであり、どの書式指定子が扱えるかはストリームに設定されているロケールのtime_getファセットに依存する。
tmbが指すオブジェクトのうち、書式に現れなかったメンバは変更されない。そのため、あらかじめ値初期化しておくとよい。
この関数は書式化入力関数として振る舞う。
例
#include <iostream>
#include <iomanip>
#include <sstream>
#include <ctime>
int main()
{
std::istringstream ss("2014-12-25 15:12:30");
std::tm t{};
ss >> std::get_time(&t, "%Y-%m-%d %H:%M:%S");
if (ss.fail()) {
std::cout << "parse error" << std::endl;
}
else {
std::cout << t.tm_year + 1900 << '/' << t.tm_mon + 1 << '/' << t.tm_mday << std::endl;
std::cout << t.tm_hour << ':' << t.tm_min << ':' << t.tm_sec << std::endl;
}
}
出力
2014/12/25
15:12:30
バージョン
言語
- C++11
処理系
- Clang: 3.0 ✅
- GCC: 5.1 ✅
- ICC: ??
- Visual C++: ??
関連項目
参照
- LWG Issue 1299. Confusing typo in specification for
get_time- C++11で、効果を示す説明用コード内の
tm.get(...)という誤記がtg.get(...)へ修正された
- C++11で、効果を示す説明用コード内の