共用方式為


num_get 類別

類別範本,描述可做為地區設定 Facet 的物件,以控制型 CharType 別序列轉換成數值的序列。

語法

template <class CharType, class InputIterator = istreambuf_iterator<CharType>>
class num_get : public locale::facet;

參數

CharType
程式內用於編碼地區設定字元的類型。

InputIterator
數值 get 函式從中讀取其輸入的迭代器類型。

備註

如同所有地區設定 facet,靜態物件識別碼有初始儲存值零。 第一次嘗試存取它的儲存值時,會在 id 中儲存一個唯一的正值。

建構函式

建構函式 描述
num_get 用來從序列擷取數值之 num_get 類型物件的建構函式。

Typedefs

類型名稱 描述
char_type 類型,用來描述由地區設定使用的字元。
iter_type 描述輸入迭代器的類型。

成員函式

成員函數 描述
do_get 虛擬函式,呼叫以從字元序列擷取數值或布林值。
get 從字元序列擷取數值或布林值。

需求

Header:<locale>

命名空間:std

num_get::char_type

類型,用來描述由地區設定使用的字元。

typedef CharType char_type;

備註

此類型與範本參數 CharType 同義。

num_get::d o_get

虛擬函式,呼叫以從字元序列擷取數值或布林值。

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned short& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned int& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long long& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long long& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    float& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    double& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long double& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    void *& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    bool& val) const;

參數

first
要從中讀取數字的字元範圍開頭。

last
要從中讀取數字的字元範圍結尾。

iosbase
旗標供轉換使用的 ios_base

state
失敗時會新增 failbit (請參閱 ios_base::iostate) 的狀態。

val
已讀取的值。

傳回值

已讀取值之後的迭代器。

備註

第一個虛擬的受保護成員函式

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long& val) const;

會比對序列中從第一個開始的循序[first, last)專案,直到它辨識出完整的無空整數輸入字段為止。 如果成功,它會將此字段轉換成其相等值做為類型long,並將結果儲存在 val。 它會傳回迭代器,此迭代器指定數字輸入欄位後的第一個元素。 否則,函式會將任何項目儲存在 val,並在 中state設定 ios_base::failbit 。 它會傳回迭代器,此迭代器指定有效整數輸入欄位之任何前置詞後的第一個元素。 不論是上述哪一種情況,如果傳回值等於 last,函式就會在 state 中設定 ios_base::eofbit

轉換整數輸入欄位的規則,與掃描函式在比對及轉換來自某個檔案的一系列 char 元素時所使用的規則相同。 (假設每個這類 char 元素都會以簡單、一對一的對應方式對應至類型的 Elem 對等專案。對等掃描轉換規格的判斷方式如下:

如果 iosbase.ios_base::flags() & ios_base::basefield == ios_base::oct,則轉換規格為 lo

如果 iosbase.flags() & ios_base::basefield == ios_base::hex,則轉換規格為 lx

如果 iosbase.flags() & ios_base::basefield == 0,則轉換規格為 li

否則,轉換規格會是 ld

整數輸入欄位的格式會進一步由呼叫use_facet numpunct<Elem>(iosbase.ios_base<::getloc()) 所傳回的地區設定 Facetfac 決定。 具體而言:

fac.numpunct::grouping() 會決定任何小數點左邊數字分組的方式

fac.numpunct::thousands_sep() 會決定任何小數點左邊分隔數字群組的序列。

如果沒有任何 fac.thousands_sep() 執行個體出現在數字輸入欄位中,就不會施加任何千分號條件約束。 否則,將會強制執行 fac.grouping() 所施加的任何千分號條件約束,並在進行掃描轉換之前將分隔符號移除。

第四個虛擬的受保護成員函式:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long& val) const;

行為與第一個相同,不同的是,它會以 lu 取代 ld 轉換規格。 如果成功,它會將數值輸入字段轉換成 類型的unsigned long值,並將該值儲存在 val

第五個虛擬的受保護成員函式:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long long& val) const;

行為與第一個相同,不同的是,它會以 lld 取代 ld 轉換規格。 如果成功,它會將數值輸入字段轉換成 類型的long long值,並將該值儲存在 val

第六個虛擬的受保護成員函式:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long long& val) const;

行為與第一個相同,不同的是,它會以 llu 取代 ld 轉換規格。 如果成功,它會將數值輸入字段轉換成 類型的unsigned long long值,並將該值儲存在 val

第七個虛擬的受保護成員函式:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    float& val) const;

行為與第一個相同,不同的是,它會盡力比對出完整、非空白的浮點數輸入欄位。 fac.numpunct::decimal_point() 會決定將整數與小數分隔的序列。 對等掃描轉換指定名稱是 lf

第八個虛擬的受保護成員函式:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    double& val) const;

行為與第一個相同,不同的是,它會盡力比對出完整、非空白的浮點數輸入欄位。 fac.numpunct::decimal_point() 會決定將整數與小數分隔的序列。 對等掃描轉換指定名稱是 lf

第九個虛擬的受保護成員函式:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long double& val) const;

行為與第八個相同,不同的是,對等掃描轉換指定名稱是 Lf

第十個虛擬受保護成員函式:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    void *& val) const;

行為與第一個相同,不同的是,對等掃描轉換指定名稱是 p

最後一個 (第十一個) 虛擬的受保護成員函式:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    bool& val) const;

行為與第一個相同,不同的是,它會盡力比對出完整、非空白的布林值輸入欄位。 如果成功,它會將布爾值輸入字段轉換成 類型的bool值,並將該值儲存在 val

布林值輸入欄位採用下列兩種形式其中之一。 如果 iosbase.flags() & ios_base::boolalpha 為 false,它就與整數輸入欄位相同,不同的是,轉換的值必須是 0 (代表 false) 或 1 (代表 true)。 否則,序列必須與 fac.numpunct::falsename() (代表 false) 或 fac.numpunct::truename() (代表 true) 相符。

範例

請參閱 get 的範例,其中會由 do_get 呼叫此虛擬成員函式。

num_get::get

從字元序列擷取數值或布林值。

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    bool& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned short& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned int& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long long& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long long& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    float& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    double& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long double& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    void *& val) const;

參數

first
要從中讀取數字的字元範圍開頭。

last
要從中讀取數字的字元範圍結尾。

iosbase
旗標供轉換使用的 ios_base

state
失敗時會新增 failbit (請參閱 ios_base::iostate) 的狀態。

val
已讀取的值。

傳回值

已讀取值之後的迭代器。

備註

所有成員函式都會傳回 do_get( first, last, iosbase, state, val)

第一個虛擬的受保護成員函式會嘗試比對序列 [ first, last) 中從 first 開始的一系列元素,直到它辨識出完整、非空白的整數輸入欄位為止。 如果成功,它會將此字段轉換成其相等值做為類型long,並將結果儲存在 val。 它會傳回迭代器,此迭代器指定數字輸入欄位後的第一個元素。 否則,函式會將任何專案儲存在 val,並設定ios_base::failbit狀態。 它會傳回迭代器,此迭代器指定有效整數輸入欄位之任何前置詞後的第一個元素。 在任一情況下,如果傳回值等於 last,則函式 ios_base::eofbit 會設定為 狀態

轉換整數輸入欄位的規則,與掃描函式在比對及轉換來自某個檔案的一系列 char 元素時所使用的規則相同。 每個這類 char 專案都假設透過簡單、一對一的對應對應對應至類型的 CharType 對等專案。 對等的掃描轉換規格是以下列方式決定:

  • 如果iosbase.旗標為& ios_base::basefield == ios_base::oct,則轉換規格為 。lo

  • 如果 iosbase.flags & ios_base::basefield == ios_base::hex,則轉換規格為 lx

  • 如果 iosbase.flags & ios_base::basefield == 0,則轉換規格為 li

  • 否則,轉換規格會是 ld

整數輸入欄位的格式會進一步由呼叫傳回的地區設定 facet fac 來決定use_facet<Elem>(iosbase.<numpunctgetloc。()) 具體而言:

  • fac.grouping 會決定任何小數點左邊數字分組的方式。

  • fac.thousands_sep 會決定任何小數點左邊分隔數字群組的序列。

如果沒有任何 fac.thousands_sep 執行個體出現在數字輸入欄位中,就不會施加任何千分號條件約束。 否則,會強制執行 所 fac.grouping 強加的任何群組條件約束,並在掃描轉換發生之前移除分隔符。

第二個虛擬的受保護成員函式:

virtual iter_type do_get(iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long& val) const;

行為與第一個相同,不同的是,它會以 lu 取代 ld 轉換規格。 如果成功,它會將數值輸入字段轉換成 類型的unsigned long值,並將該值儲存在 val

第三個虛擬的受保護成員函式:

virtual iter_type do_get(iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    double& val) const;

行為與第一個相同,不同的是,它會嘗試比對出完整、非空白的浮點數輸入欄位。 fac.decimal_point 會決定將整數與小數分隔的序列。 對等掃描轉換指定名稱是 lf

第四個虛擬的受保護成員函式:

virtual iter_type do_get(iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long double& val) const;

行為相同的第三個,不同之處在於對等的掃描轉換規範是 Lf

第五個虛擬的受保護成員函式:

virtual iter_type do_get(iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    void *& val) const;

行為與第一個相同,不同的是,對等掃描轉換指定名稱是 p

第六個虛擬的受保護成員函式:

virtual iter_type do_get(iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    bool& val) const;

行為與第一個相同,不同的是,它會嘗試比對出完整、非空白的布林值輸入欄位。 如果成功,它會將布爾值輸入字段轉換成 類型的bool值,並將該值儲存在 val

布林值輸入欄位採用下列兩種形式其中之一。 如果 iosbase.flags & ios_base::boolalphafalse,它與整數輸入字段相同,不同之處在於轉換的值必須是 0 (for false) 或 1 (針對 true)。 否則,序列必須符合 fac.falsename (針對 false), 或fac. truename (針對 true)。

範例

// num_get_get.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <sstream>
using namespace std;
int main( )
{
   locale loc( "german_germany" );

   basic_stringstream<char> psz, psz2;
   psz << "-1000,56";

   ios_base::iostate st = 0;
   long double fVal;
   cout << use_facet <numpunct <char> >(loc).thousands_sep( ) << endl;

   psz.imbue( loc );
   use_facet <num_get <char> >
   (loc).get( basic_istream<char>::_Iter( psz.rdbuf( ) ),
           basic_istream<char>::_Iter(0), psz, st, fVal );

   if ( st & ios_base::failbit )
      cout << "money_get( ) FAILED" << endl;
   else
      cout << "money_get( ) = " << fVal << endl;
}

num_get::iter_type

描述輸入迭代器的類型。

typedef InputIterator iter_type;

備註

此類型是範本參數 InputIterator的同義字。

num_get::num_get

用來從序列擷取數值之 num_get 類型物件的建構函式。

explicit num_get(size_t refs = 0);

參數

裁判
整數值,用來指定物件的記憶體管理類型。

備註

refs 參數的可能值及其重要性如下:

  • 0:物件的存留期由包含該物件的地區設定來管理。

  • 1:物件的存留期必須以手動方式管理。

  • > 1:未定義這些值。

無法提供任何直接範例,因為解構函式受到保護。

建構函式會使用 locale::Facet(refs)初始化其基底物件。

另請參閱

<地區設定>
facet 類別
C++ 標準程式庫中的執行緒安全