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 起) |
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 转换指定符的字符(见下方),则将这些字符用于调用 do_get(beg, end, str, err, t, format, modifier) ,其中
format
为初等转换指定符字符,而 modifier
为可选的修饰符(若存在,则出现于 %
和格式字符间)。若无修饰符,则使用值 '\0' 。若格式字符串有歧义,或过早结束而无以确定 '%' 后的转换指定符,则在 err
中设置 eofbit
并终止循环。若调用 do_get
后 err
中未设置错误位,则函数增加 fmtbeg
到正好指向转换指定符之后,并持续循环。b) 若下个字符为流
str
中提供的 locale 所指示的空白符(即 std::isspace(*fmtbeg, str.getloc()) == true ),则函数保持自增 fmtbeg
直至它变为等于 fmtend
或指向非空白字符。c) 若格式字符串中的下个字符按照大小写无关比较,等价于输入流中的下个字符,则函数令二个序列一同前进一个字符 ++fmtbeg, ++beg; 并持续循环。否则它设置
err
中的 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 清除
- 对于复合转换指定符,如 '%x' 或 '%c' ,或使用修饰符 'E' 和 'O' 的指令,函数可能无法确定存储于 *t 的某些值。该情况下设置
err
中的eofbit
,并将这些域留在未指定状态。
- 对于复合转换指定符,如 '%x' 或 '%c' ,或使用修饰符 'E' 和 'O' 的指令,函数可能无法确定存储于 *t 的某些值。该情况下设置
参数
beg | - | 指代要分析的序列起始的迭代器 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | - | 要分析的序列的尾后一位置迭代器 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
str | - | 此函数在需要时用以获得 locale 平面的流对象,例如用 std::ctype 跳过空白符或用 std::collate 比较字符串 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
err | - | 此函数所修改以指示错误的流错误标志对象 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t | - | 指向 std::tm 对象的指针,该对象将保有此函数调用结果 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmtbeg | - | 指向指定转换格式的 char_type 字符序列首字符的指针
格式字符串由零或更多转换说明符、空白符和通常字符(除了
注意:不写入
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmtend | - | 指定转换格式的 char_type 字符序列的末字符后一位置指针 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
format | - | 指名转换指定符的字符 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
modifier | - | 可出现于 % 和转换指定符间的可选修饰符
|
返回值
指向 [beg, end)
中成功分析的末字符后一位置的迭代器。
注意
格式字符串中非空白非 '%' 字符的大小写无关比较,不要求,但典型地使用 str
所提供的 locale 的 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) |
剖析指定格式的日期/时间值 (函数模板) |