函数
<iomanip>

std::get_time

template <class charT>/*unspecified*/ get_time (struct tm* tmb, const charT* fmt);
获取日期和时间
从其应用的输入流中提取字符,并根据参数fmt指定的格式将它们解释为日期和时间信息。获取的数据存储在tmb指向的struct tm对象中。

在内部,该函数首先构造一个basic_istream::sentry类型的对象来访问输入序列。然后(如果sentry对象的评估结果为true),它会调用time_get::get(使用流的选定区域设置)来执行提取和解析操作,并相应地调整流的内部状态标志。最后,它在返回前销毁sentry对象。

此操纵符在头文件 <iomanip> 中声明。

参数

tmb
tmb是指向struct tm类型的对象的指针,提取的日期和时间信息将存储在该对象中。
struct tm是在标头文件<ctime>中定义的类。
fmt
fmt是由time_get::get用作格式字符串的C字符串(参见time_get::get)。
charT是C字符串中的字符类型。

返回值

未指定。此函数只应作为流操纵符使用(见示例)。

错误通过修改流的内部状态标志来指示。
flagerror
eofbit输入序列没有更多可用字符(已达到文件尾)。
failbit要么没有提取字符,要么提取的字符无法解释为有效的货币值。
badbit流错误(例如,当此函数捕获由内部操作抛出的异常时)。
当此标志被设置时,流的完整性可能已受到影响。
多个标志可能由单个操作设置。

如果该操作在流上设置了一个使用其成员exceptions注册的内部状态标志,则函数将抛出类型为ios_base::failure的异常。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// get_time example
#include <iostream>     // std::cin, std::cout
#include <iomanip>      // std::get_time
#include <ctime>        // struct std::tm

int main ()
{
  struct std::tm when;
  std::cout << "Please, enter the time: ";
  std::cin >> std::get_time(&when,"%R");   // extract time (24H format)

  if (std::cin.fail()) std::cout << "Error reading time\n";
  else {
    std::cout << "The time entered is: ";
    std::cout << when.tm_hour << " hours and " << when.tm_min << " minutes\n";
  }

  return 0;
}


数据竞争

访问fmt指向的数组。修改tmb指向的对象以及从中提取数据的流对象。
对同一流对象的并发访问可能导致数据竞争,标准流对象cinwcin在与stdio同步时除外(在这种情况下,不会产生数据竞争,尽管提取的字符归属于哪个线程没有保证)。

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果最终的错误状态标志不是goodbit并且成员exceptions被设置为在该状态下抛出,则该函数会抛出成员类型为failure的异常。
由内部操作抛出的任何异常都会被函数捕获和处理,并设置badbit。如果在上一次调用exceptions时设置了badbit,则函数会重新抛出捕获到的异常。

请注意,无效参数会导致未定义行为

另见