Compartir a través de


num_get (Clase)

Una plantilla de clase que describe un objeto que puede actuar como una faceta de la configuración regional para controlar las conversiones de las secuencias de tipo CharType en valores numéricos.

Sintaxis

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

Parámetros

CharType
Tipo usado dentro de un programa para codificar los caracteres de una configuración regional.

InputIterator
El tipo de iterador del que las funciones get numéricas leen su entrada.

Comentarios

Como ocurre con cualquier faceta de configuración regional, el identificador de objeto estático tiene un valor almacenado inicial de cero. El primer intento de acceso a su valor almacenado almacena un valor positivo único en id.

Constructores

Constructor Descripción
num_get Constructor para los objetos de tipo num_get que se usan para extraer valores numéricos de secuencias.

Typedefs

Nombre de tipo Descripción
char_type Tipo que se usa para describir un carácter empleado por una configuración regional.
iter_type Tipo que describe un iterador de entrada.

Funciones miembro

Función de miembro Descripción
do_get Función virtual a la que se llama para extraer un valor numérico o un valor booleano de una secuencia de caracteres.
get Extrae un valor numérico o un valor booleano de una secuencia de caracteres.

Requisitos

Encabezado:<locale>

Espacio de nombres: std

num_get::char_type

Tipo que se usa para describir un carácter empleado por una configuración regional.

typedef CharType char_type;

Comentarios

El tipo es un sinónimo del parámetro de plantilla CharType.

num_get::d o_get

Función virtual a la que se llama para extraer un valor numérico o un valor booleano de una secuencia 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
El principio del intervalo de caracteres del que se va a leer el número.

last
El final del intervalo de caracteres del que se va a leer el número.

iosbase
El objeto ios_base cuyas marcas se usan por la conversión.

state
El estado al que failbit (ver ios_base::iostate) se agrega en caso de error.

val
Valor que se leyó.

Valor devuelto

El iterador después de que el valor se haya leído.

Comentarios

La primera función miembro virtual protegida,

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

hace coincidir elementos secuenciales que comienzan por first en la secuencia [first, last) hasta que reconoce un campo de entrada numérico entero completo y que no esté vacío. Si se realiza correctamente, convierte este campo en su valor equivalente como tipo long y almacena el resultado en val. Devuelve un iterador que designa el primer elemento más allá del campo de entrada numérico. De otro modo, la función no almacena nada en val y establece ios_base::failbit en state. Devuelve un iterador que designa el primer elemento más allá de cualquier prefijo de un campo de entrada numérico entero válido. En cualquier caso, si el valor devuelto es igual a last, la función establece ios_base::eofbit en state.

El campo de entrada numérico entero se convierte mediante las mismas reglas que han usado las funciones de análisis para hacer coincidir y convertir una serie de elementos char de un archivo. (Se presupone que cada uno de estos elementos char se asigna a un elemento equivalente de tipo Elem mediante una asignación simple, uno a uno). La especificación de conversión de análisis equivalente se determina de la manera siguiente:

Si iosbase.ios_base::flags() & ios_base::basefield == ios_base::oct, la especificación de conversión es lo.

Si iosbase.flags() & ios_base::basefield == ios_base::hex, la especificación de conversión es lx.

Si iosbase.flags() & ios_base::basefield == 0, la especificación de conversión es li.

De otro modo, la especificación de conversión es ld.

El formato de un campo de entrada entero viene determinado por la facetafac de configuración regional devuelta por la llamada use_facet< numpunct<Elem>(iosbase.ios_base::getloc.()) Específicamente:

fac.numpunct::grouping() determina cómo se agrupan los dígitos a la izquierda de cualquier separador decimal.

fac.numpunct::thousands_sep() determina la secuencia que separa grupos de dígitos a la izquierda de cualquier separador decimal.

Si no se produce ninguna instancia de fac.thousands_sep() en el campo de entrada numérico, no se impone ninguna restricción de agrupación. De otro modo, se aplica cualquier restricción de agrupación impuesta por fac.grouping() y los separadores se quitan antes de que se produzca la conversión de análisis.

La cuarta función miembro virtual protegida:

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

se comporta igual que la primera, excepto que reemplaza una especificación de conversión de ld por lu. Si se realiza correctamente, convierte el campo de entrada numérico en un valor de tipo unsigned long y almacena ese valor en val.

La quinta función miembro virtual protegida:

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

se comporta igual que la primera, excepto que reemplaza una especificación de conversión de ld por lld. Si se realiza correctamente, convierte el campo de entrada numérico en un valor de tipo long long y almacena ese valor en val.

La sexta función miembro 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;

se comporta igual que la primera, excepto que reemplaza una especificación de conversión de ld por llu. Si se realiza correctamente, convierte el campo de entrada numérico en un valor de tipo unsigned long long y almacena ese valor en val.

La séptima función miembro virtual protegida:

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

se comporta igual que la primera, excepto que intenta coincidir con un campo de entrada de punto flotante completo y que no esté vacío. fac.numpunct::decimal_point() determina la secuencia que separa los dígitos enteros de los dígitos de fracción. El especificador de conversión de análisis equivalente es lf.

La octava función miembro virtual protegida:

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

se comporta igual que la primera, excepto que intenta coincidir con un campo de entrada de punto flotante completo y que no esté vacío. fac.numpunct::decimal_point() determina la secuencia que separa los dígitos enteros de los dígitos de fracción. El especificador de conversión de análisis equivalente es lf.

La novena función miembro virtual protegida:

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

se comporta igual que la octava, excepto que el especificador de conversión de análisis equivalente es Lf.

La décima función miembro virtual protegida:

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

se comporta igual que la primera, excepto que el especificador de conversión de análisis equivalente es p.

La última (undécima) función miembro virtual protegida:

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

se comporta igual que la primera, excepto que intenta coincidir con un campo de entrada booleano completo y que no esté vacío. Si se realiza correctamente, convierte el campo de entrada booleano en un valor de tipo bool y almacena ese valor en val.

Un campo de entrada booleano adopta una de dos formas. Si iosbase.flags() & ios_base::boolalpha es False, es igual que un campo de entrada numérico entero, excepto que el valor convertido debe ser 0 (para False) o 1 (para True). De otro modo, la secuencia debe coincidir con fac.numpunct::falsename() (para False), o con fac.numpunct::truename() (para True).

Ejemplo

Vea el ejemplo de get, donde do_get llama a la función miembro virtual.

num_get::get

Extrae un valor numérico o un valor booleano de una secuencia 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
El principio del intervalo de caracteres del que se va a leer el número.

last
El final del intervalo de caracteres del que se va a leer el número.

iosbase
El objeto ios_base cuyas marcas se usan por la conversión.

state
El estado al que failbit (ver ios_base::iostate) se agrega en caso de error.

val
Valor que se leyó.

Valor devuelto

El iterador después de que el valor se haya leído.

Comentarios

Todas las funciones miembro devuelven do_get( first, last, iosbase, state, val).

La primera función miembro virtual protegida intenta comparar los elementos secuenciales, empezando al principio de la secuencia [ first, last) hasta que reconoce un campo de entrada numérico entero completo y que no esté vacío. Si se realiza correctamente, convierte este campo en su valor equivalente como tipo long y almacena el resultado en val. Devuelve un iterador que designa el primer elemento más allá del campo de entrada numérico. De otro modo, la función no almacena nada en val y establece ios_base::failbit en state. Devuelve un iterador que designa el primer elemento más allá de cualquier prefijo de un campo de entrada numérico entero válido. En cualquier caso, si el valor devuelto es igual a last, la función establece ios_base::eofbit en state.

El campo de entrada numérico entero se convierte mediante las mismas reglas que han usado las funciones de análisis para hacer coincidir y convertir una serie de elementos char de un archivo. Se supone que cada uno de estos elementos char se asigna a un elemento equivalente de tipo CharType mediante una asignación simple, uno a uno. La especificación de conversión de análisis equivalente se determina de la manera siguiente:

  • Si iosbase.flags& ios_base::basefield == ios_base::oct, la especificación de conversión es lo.

  • Si iosbase.flags & ios_base::basefield == ios_base::hex, la especificación de conversión es lx.

  • Si iosbase.flags & ios_base::basefield == 0, la especificación de conversión es li.

  • De otro modo, la especificación de conversión es ld.

El formato de un campo de entrada entero viene determinado por la faceta fac de configuración regional devuelta por la llamada use_facet<numpunct<Elem>(iosbase.getloc.()) Específicamente:

  • fac.grouping determina cómo se agrupan los dígitos a la izquierda de cualquier separador decimal.

  • fac.thousands_sep determina la secuencia que separa grupos de dígitos a la izquierda de cualquier separador decimal.

Si no se produce ninguna instancia de fac.thousands_sep en el campo de entrada numérico, no se impone ninguna restricción de agrupación. De otro modo, se aplica cualquier restricción de agrupación impuesta por fac.grouping y los separadores se quitan antes de que se produzca la conversión de análisis.

La segunda función miembro virtual protegida:

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

se comporta igual que la primera, excepto que reemplaza una especificación de conversión de ld por lu. Si se realiza correctamente, convierte el campo de entrada numérico en un valor de tipo unsigned long y almacena ese valor en val.

La tercera función miembro virtual protegida:

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

se comporta igual que la primera, excepto que intenta coincidir con un campo de entrada de punto flotante completo y que no esté vacío. fac.decimal_point determina la secuencia que separa los dígitos enteros de los dígitos de fracción. El especificador de conversión de análisis equivalente es lf.

La cuarta función miembro virtual protegida:

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

se comporta igual que la tercera, excepto que el especificador de conversión de análisis equivalente es Lf.

La quinta función miembro virtual protegida:

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

se comporta igual que la primera, excepto que el especificador de conversión de análisis equivalente es p.

La sexta función miembro virtual protegida:

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

se comporta igual que la primera, excepto que intenta coincidir con un campo de entrada booleano completo y que no esté vacío. Si se realiza correctamente, convierte el campo de entrada booleano en un valor de tipo bool y almacena ese valor en val.

Un campo de entrada booleano adopta una de dos formas. Si iosbase.flags & ios_base::boolalpha es false, es igual que un campo de entrada numérico entero, excepto en que el valor convertido debe ser 0 (para false) o 1 (para true). De otro modo, la secuencia debe coincidir con fac.falsename (para false) o con fac.truename (para true).

Ejemplo

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

Tipo que describe un iterador de entrada.

typedef InputIterator iter_type;

Comentarios

El tipo es un sinónimo del parámetro de plantilla InputIterator.

num_get::num_get

Constructor para los objetos de tipo num_get que se usan para extraer valores numéricos de secuencias.

explicit num_get(size_t refs = 0);

Parámetros

refs
Valor entero que se usa para especificar el tipo de administración de memoria del objeto.

Comentarios

Los valores posibles del parámetro refs y su importancia son:

  • 0: la vigencia del objeto se administra mediante las configuraciones regionales que lo contienen.

  • 1: la vigencia del objeto se debe administrar de manera manual.

  • > 1: estos valores no están definidos.

No es posible mostrar ejemplos directos, porque el destructor está protegido.

El constructor inicializa su objeto base con locale::facet(refs).

Consulte también

<locale>
facet (Clase)
Seguridad para subprocesos en la biblioteca estándar de C++