函式
<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,則函式會重新丟擲捕獲到的異常。

請注意,無效引數會導致未定義行為

另見