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