Compartilhar via


Classe num_get

Um modelo de classe que descreve um objeto que pode servir como uma faceta de localidade para controlar conversões de sequências do tipo CharType em valores numéricos.

Sintaxe

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

Parâmetros

CharType
O tipo usado em um programa para codificar caracteres em uma localidade.

InputIterator
O tipo de iterador do qual as funções get numéricas leem sua entrada.

Comentários

Como qualquer faceta de localidade, a ID de objeto estático tem um valor armazenado inicial de zero. A primeira tentativa de acessar seu valor armazenado armazena um valor positivo exclusivo na id.

Construtores

Construtor Descrição
num_get O construtor para objetos do tipo num_get que são usados para extrair valores numéricos das sequências.

Typedefs

Nome do tipo Descrição
char_type Um tipo que é usado para descrever um caractere usado por uma localidade.
iter_type Um tipo que descreve um iterador de entrada.

Funções de membro

Função de membro Descrição
do_get Uma função virtual que é chamada para extrair um valor numérico ou booliano de uma sequência de caracteres.
get Extrai um valor numérico ou booliano de uma sequência de caracteres.

Requisitos

Cabeçalho:<locale>

Namespace: std

num_get::char_type

Um tipo que é usado para descrever um caractere usado por uma localidade.

typedef CharType char_type;

Comentários

O tipo é um sinônimo do parâmetro de modelo CharType.

num_get::d o_get

Uma função virtual que é chamada para extrair um valor numérico ou booliano de uma sequência de caracteres.

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;

Parâmetros

first
O início do intervalo de caracteres do qual o número será lido.

last
O fim do intervalo de caracteres do qual o número será lido.

iosbase
O ios_base cujos sinalizadores são usados pela conversão.

state
O estado para o qual failbit (consulte ios_base::iostate) é adicionado após a falha.

val
O valor que foi lido.

Valor de retorno

O iterador depois que o valor foi lido.

Comentários

A primeira função membro virtual protegida,

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

corresponde a elementos sequenciais começando no primeiro da sequência [first, last) até que tenha reconhecido um campo de entrada de número inteiro completo e não vazio. Se for bem-sucedido, converte esse campo em seu valor equivalente como o tipo long e armazena o resultado em val. Ele retorna um iterador que designa o primeiro elemento além do campo de entrada numérico. Caso contrário, a função não armazena nada em val e define ios_base::failbit em state. Ele retorna um iterador que designa o primeiro elemento além de qualquer prefixo de um campo de entrada de inteiro válido. Em ambos os casos, se o valor retornado for igual a last, a função definirá ios_base::eofbit em state.

O campo de entrada de inteiro é convertido pelas mesmas regras usadas pelas funções de verificação de correspondência e pela conversão de uma série de elementos char de um arquivo. (Supõe-se que cada elemento char seja mapeado para um elemento equivalente do tipo Elem por um mapeamento simples, um para um). A especificação de conversão de varredura equivalente é determinada da seguinte forma:

Se iosbase.ios_base::flags() & ios_base::basefield == ios_base::oct, a especificação de conversão é lo.

Se iosbase.flags() & ios_base::basefield == ios_base::hex, a especificação de conversão é lx.

Se iosbase.flags() & ios_base::basefield == 0, a especificação de conversão é li.

Caso contrário, a especificação de conversão é ld.

O formato de um campo de entrada inteiro é determinado ainda mais pela faceta de localidade retornada pela chamada use_facet <numpunct<Elem>(iosbase.ios_base::getloc.())fac Especificamente:

fac.numpunct::grouping() determina como os dígitos são agrupados à esquerda de qualquer vírgula decimal

fac.numpunct::thousands_sep() determina a sequência que separa grupos de dígitos à esquerda de qualquer vírgula decimal.

Se nenhuma instância de fac.thousands_sep() ocorrer no campo de entrada numérico, nenhuma restrição de agrupamento é imposta. Caso contrário, qualquer restrição de agrupamento imposta pelo fac.grouping() será imposta e os separadores serão removidos antes que a verificação de conversão ocorra.

A quarta função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que substitui uma especificação de conversão de ld por lu. Se bem-sucedido, converte o campo de entrada numérico em um valor do tipo unsigned long e armazena esse valor em val.

A quinta função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que substitui uma especificação de conversão de ld por lld. Se bem-sucedido, converte o campo de entrada numérico em um valor do tipo long long e armazena esse valor em val.

A sexta função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que substitui uma especificação de conversão de ld por llu. Se bem-sucedido, converte o campo de entrada numérico em um valor do tipo unsigned long long e armazena esse valor em val.

A sétima função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que esforça-se para corresponder a um campo de entrada de ponto flutuante completo e não vazio. fac.numpunct::decimal_point() determina a sequência que separa os dígitos de inteiro dos dígitos de fração. O especificador de conversão de verificação equivalente é lf.

A oitava função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que esforça-se para corresponder a um campo de entrada de ponto flutuante completo e não vazio. fac.numpunct::decimal_point() determina a sequência que separa os dígitos de inteiro dos dígitos de fração. O especificador de conversão de verificação equivalente é lf.

A nona função membro virtual protegida:

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

comporta-se da mesma maneira que a oitava, exceto que o especificador de conversão de verificação equivalente é Lf.

A décima função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que o especificador de conversão de verificação equivalente é p.

A última (décima primeira) função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que esforça-se para corresponder a um campo de entrada booliano completo e não vazio. Se bem-sucedido, converte o campo de entrada booliano em um valor do tipo bool e armazena esse valor em val.

Um campo de entrada Booliano adota um de dois formatos. Se iosbase.flags() & ios_base::boolalpha for false, será o mesmo que um campo de entrada inteiro, exceto que o valor convertido deve ser 0 (para false) ou 1 (para true). Caso contrário, a sequência deve corresponder a fac.numpunct::falsename() (para falso) ou fac.numpunct::truename() (para verdadeiro).

Exemplo

Veja o exemplo de obter, em que a função membro virtual é chamada por do_get.

num_get::get

Extrai um valor numérico ou booliano de uma sequência de caracteres.

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;

Parâmetros

first
O início do intervalo de caracteres do qual o número será lido.

last
O fim do intervalo de caracteres do qual o número será lido.

iosbase
O ios_base cujos sinalizadores são usados pela conversão.

state
O estado para o qual failbit (consulte ios_base::iostate) é adicionado após a falha.

val
O valor que foi lido.

Valor de retorno

O iterador depois que o valor foi lido.

Comentários

Todas as funções membro retornam do_get( first, last, iosbase, state, val).

A primeira função membro virtual protegida virtual tenta corresponder elementos sequenciais, começando pelo primeiro na sequência [ first, last) até ter reconhecido um campo de entrada inteiro completo e não vazio. Se for bem-sucedido, converte esse campo em seu valor equivalente como o tipo long e armazena o resultado em val. Ele retorna um iterador que designa o primeiro elemento além do campo de entrada numérico. Caso contrário, a função não armazena nada em val e define ios_base::failbit em state. Ele retorna um iterador que designa o primeiro elemento além de qualquer prefixo de um campo de entrada de inteiro válido. Em ambos os casos, se o valor retornado for igual a last, a função define ios_base::eofbit em state.

O campo de entrada de inteiro é convertido pelas mesmas regras usadas pelas funções de verificação de correspondência e pela conversão de uma série de elementos char de um arquivo. Cada elemento char é considerado mapeado para um elemento equivalente do tipo CharType por um mapeamento um para um simples. A especificação de conversão de verificação equivalente é determinada da seguinte forma:

  • Se iosbase.flags& ios_base::basefield == ios_base::oct, a especificação de conversão será lo.

  • Se iosbase.flags & ios_base::basefield == ios_base::hex, a especificação de conversão é lx.

  • Se iosbase.flags & ios_base::basefield == 0, a especificação de conversão é li.

  • Caso contrário, a especificação de conversão é ld.

O formato de um campo de entrada inteiro é determinado ainda mais pela faceta de localidade retornada pela chamada use_facetnumpunct<<Elem>(iosbase.getloc.()) fac Especificamente:

  • fac.grouping determina como os dígitos são agrupados à esquerda da vírgula decimal.

  • fac.thousands_sep determina a sequência que separa grupos de dígitos à esquerda da vírgula decimal

Se nenhuma instância de fac.thousands_sep ocorrer no campo de entrada numérico, nenhuma restrição de agrupamento é imposta. Caso contrário, qualquer restrição de agrupamento imposta pelo fac.grouping será imposta e os separadores serão removidos antes que a verificação de conversão ocorra.

A segunda função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que substitui uma especificação de conversão de ld por lu. Se bem-sucedido, converte o campo de entrada numérico em um valor do tipo unsigned long e armazena esse valor em val.

A terceira função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que esforça-se para corresponder a um campo de entrada de ponto flutuante completo e não vazio. fac.decimal_point determina a sequência que separa os dígitos de inteiros dos dígitos de fração. O especificador de conversão de verificação equivalente é lf.

A quarta função membro virtual protegida:

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

comporta-se da mesma maneira que a terceira, exceto que o especificador de conversão de verificação equivalente é Lf.

A quinta função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que o especificador de conversão de verificação equivalente é p.

A sexta função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que tenta corresponder a um campo de entrada booliano completo e não vazio. Se bem-sucedido, converte o campo de entrada booliano em um valor do tipo bool e armazena esse valor em val.

Um campo de entrada booliano adota um de dois formatos. Se iosbase.flags & ios_base::boolalpha for false, será o mesmo que um campo de entrada inteiro, exceto que o valor convertido deve ser 0 (para false) ou 1 (para true). Caso contrário, a sequência deve corresponder a fac.falsename (para false) ou fac.truename (para true).

Exemplo

// 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

Um tipo que descreve um iterador de entrada.

typedef InputIterator iter_type;

Comentários

O tipo é um sinônimo do parâmetro de modeloInputIterator.

num_get::num_get

O construtor para objetos do tipo num_get que são usados para extrair valores numéricos das sequências.

explicit num_get(size_t refs = 0);

Parâmetros

refs
Valor inteiro usado para especificar o tipo de gerenciamento de memória do objeto.

Comentários

Os valores possíveis para o parâmetro refs e o significado são:

  • 0: o tempo de vida do objeto é gerenciado pelas localidades que o contêm.

  • 1: o tempo de vida do objeto deve ser gerenciado manualmente.

  • > 1: esses valores não estão definidos.

Nenhum exemplo direto é possível, pois o destruidor está protegido.

O construtor inicializa seu objeto base com locale::facet(refs).

Confira também

<locale>
Classe facet
Acesso Thread-Safe na Biblioteca Padrão C++