Namespaces
Variants

std::codecvt<InternT,ExternT,StateT>:: in, std::codecvt<InternT,ExternT,StateT>:: do_in

From cppreference.net
Definido en el encabezado <locale>
public :

result in ( StateT & state,
const ExternT * from,
const ExternT * from_end,
const ExternT * & from_next,
InternT * to,
InternT * to_end,

InternT * & to_next ) const ;
(1)
protected :

virtual result do_in ( StateT & state,
const ExternT * from,
const ExternT * from_end,
const ExternT * & from_next,
InternT * to,
InternT * to_end,

InternT * & to_next ) const ;
(2)
1) Función miembro pública, llama a la función miembro do_in de la clase más derivada.
2) Si esta faceta codecvt define una conversión, traduce los caracteres externos del rango fuente [ from , from_end ) a caracteres internos, colocando los resultados en las ubicaciones subsiguientes comenzando en to . Convierte no más de from_end - from caracteres externos y escribe no más de to_end - to caracteres internos. Deja from_next y to_next apuntando justo después del último elemento convertido exitosamente.

Si este codecvt facet no define una conversión, no se convierten caracteres. to_next se establece igual a to , state permanece sin cambios, y se retorna std::codecvt_base::noconv .

do_in ( state, from, from_end, from_next, to, to + 1 , to_next ) debe retornar ok si

  • esta codecvt facet es utilizada por basic_filebuf , y
  • do_in ( state, from, from_end, from_next, to, to_end, to_next ) retornaría ok donde to ! = to_end .

Contenidos

Valor de retorno

Un valor de tipo std::codecvt_base::result , que indica el estado de éxito de la siguiente manera:

ok conversión completada
partial espacio insuficiente en el buffer de salida o fin inesperado del buffer de origen
error se encontró un carácter que no pudo ser convertido
noconv esta faceta no convierte, no se escribió ninguna salida

La especialización no convertidora std:: codecvt < char , char , std:: mbstate_t > siempre retorna std::codecvt_base::noconv .

Notas

Requiere que from <= from_end && to <= to_end y que state represente ya sea el estado de desplazamiento inicial o se haya obtenido convirtiendo los caracteres precedentes en la secuencia.

El efecto sobre state está deliberadamente sin especificar. En facetas estándar, se utiliza para mantener el estado de desplazamiento como cuando se llama a std::mbsrtowcs , y por lo tanto se actualiza para reflejar el estado de conversión después del último carácter externo procesado, pero una faceta definida por el usuario es libre de usarlo para mantener cualquier otro estado, por ejemplo, contar el número de caracteres especiales encontrados.

Ejemplo

#include <iostream>
#include <locale>
#include <string>
int main()
{
    std::locale::global(std::locale("en_US.utf8"));
    auto const& f = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>
        (std::locale());
    std::string external = "z\u00df\u6c34\U0001d10b"; // or u8"zß水𝄋"
                     // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"
    // note that the following can be done with wstring_convert
    std::mbstate_t mb = std::mbstate_t(); // initial shift state
    std::wstring internal(external.size(), '\0'); 
    const char* from_next;
    wchar_t* to_next;
    f.in(mb, &external[0], &external[external.size()], from_next,
             &internal[0], &internal[internal.size()], to_next);
    // error checking skipped for brevity
    internal.resize(to_next - &internal[0]);
    std::wcout << L"The string in wide encoding: " << internal << '\n';
}

Salida:

The string in wide encoding: zß水𝄋

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 76 C++98 no estaba claro si la conversión debe
soportar producir un carácter interno a la vez
solo se requiere si es usado
por basic_filebuf

Véase también

[virtual]
lee del archivo asociado
(función miembro protegida virtual de std::basic_filebuf<CharT,Traits> )
convierte una cadena de bytes en una cadena ancha
(función miembro pública de std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc> )
convierte una cadena de caracteres multibyte estrecha a cadena ancha, dado el estado
(función)
[virtual]
convierte una cadena de InternT a ExternT , como cuando se escribe en un archivo
(función miembro protegida virtual)