public member function
<locale>

std::time_get::get

(1)
iter_type get (iter_type s, iter_type end, ios_base& str,    ios_base::iostate& err, tm* t, char format, char modifier=0) const;
(2)
iter_type get (iter_type s, iter_type end, ios_base& str,    ios_base::iostate& err, tm* t, const char_type* fmt_begin, const char_type* fmt_end) const;
读取时间和日期
解析 send 之间的字符序列,以 format(或 fmt_beginfmt_end 之间的序列)指定的格式解析时间和/或日期,并将获取的值存储在 t 指向的 tm 对象中。

该函数读取字符,直到读取的字符无法构成有效格式序列或 end 被到达。函数返回的迭代器指向最后一个被处理字符之后的下一个字符。

如果成功,该函数将设置 tm 结构体 t 的相关成员。其余成员将保持不变。

(1) 单个格式说明符
此版本仅调用虚保护成员函数 do_get,该函数默认解析序列,其格式与 strftime 生成的格式相同,由百分号('%')后跟参数 *format* 构成字符串,并可选地在两者之间插入 modifier(当不等于零时)。
(2) 格式字符串
此版本按顺序读取范围 [fmt_begin,fmt_end) 中的字符,并以 scanf 处理其 *format string* 的方式来解释它们,但不同之处在于,函数识别的 *format specifiers* 是 strftime 使用的。对于每个被识别为 strftime 说明符的字符序列,都会调用虚保护成员函数 do_get,并传入适当的参数。
该函数使用 str 的 locale 的 ctype 方面的属性来确定空格字符。

一个 ios_base::iostate 位掩码值将存储在 err 中,表示操作的结果。
err 中的值描述
goodbit成功:整个序列 [fmt_begin,fmt_end) 已被处理,未到达 end
failbit失败:序列与预期的格式不匹配。
eofbit已到达 end
注意:如果发生在 fmt_end 前一个字符被处理之前,函数将同时设置 failbiteofbit

参数

s, end
指向序列开始和结束字符的迭代器。使用的范围是 [s,end),包含 s 指向的字符到 end 指向的字符之间的所有字符,但 end 指向的字符不包含在内。
成员类型 iter_type 是该方面的迭代器类型(定义为 time_get 的第二个模板参数 InputIterator 的别名)。默认情况下,这是一个 istreambuf_iterator,允许从 basic_istream 对象隐式转换。
str
派生自 ios_base 的类对象(通常是输入流对象)。它仅用于获取格式信息。
err
流错误状态对象,类型为 ios_base::iostate,用于存储错误状态。
t
指向 struct tm (在头文件 <ctime> 中定义)的指针,其成员在成功调用此成员函数后会被设置。
format
格式说明符,指示序列的有效格式;对于 do_get 的默认实现,这应该是 strftime 接受的说明符之一。
modifier
某些实现允许对说明符使用格式修饰符。
值为 0'\0')被解释为无修饰符。
fmt_begin, fmt_end
指向构成函数 *format string* 的序列的开始和结束字符的指针。
成员类型 char_type 是该方面的字符类型(定义为 time_get 的第一个模板参数 charT 的别名)。
请注意,对于这两个范围,*空字符*(如果存在)也被视为有效,并且函数会继续处理它们,直到发生失败或其中一个范围被耗尽。

返回值

在操作使用的最后一个字符之后的序列 [s,end) 中的下一个字符。
成员类型 iter_type 是此 facet 的迭代器类型(定义为 time_get 的第二个模板参数 InputIterator 的别名)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// time_get::get example
#include <iostream>       // std::cout, std::ios
#include <string>         // std::string
#include <sstream>        // std::istringstream
#include <ctime>          // std::tm
#include <locale>         // std::locale, std::time_get, std::use_facet

int main ()
{
  std::locale loc;        // classic "C" locale

  // get time_get facet:
  auto& tmget = std::use_facet <std::time_get<char> > (loc);

  std::ios::iostate state;
  std::istringstream iss ("year:2013 month:09 day:10");
  std::string format ("year:%Y month:%m day:%d");
  std::tm when;

  tmget.get (iss, std::time_get<char>::iter_type(), iss, state, &when,
             format.data(), format.data()+format.length() );

  std::cout << "year: " << when.tm_year << '\n';
  std::cout << "mon: " << when.tm_mon << '\n';
  std::cout << "mday: " << when.tm_mday << '\n';
  return 0;
}

输出

year: 113
mon: 8
mday: 10


数据竞争

该对象以及 send 之间以及 fmt_beginfmt_end 之间的整个范围都将被访问。
参数 strerrt 可能会被修改。

异常安全

如果抛出异常,*方面对象* 不会有任何更改,尽管某些参数可能已被影响。

另见