Namespaces
Variants

std::basic_ios<CharT,Traits>:: copyfmt

From cppreference.net
basic_ios & copyfmt ( const basic_ios & other ) ;

Si other se refiere al mismo objeto que * this , no tiene efectos. De lo contrario, copia el estado del flujo other en * this . Esto se realiza en la siguiente secuencia:

1) Llama a cada callback registrado por register_callback() pasando erase_event como parámetro.
2) Copia todos los objetos miembro desde other hacia * this excepto por rdstate() , la máscara de excepciones, y rdbuf() . En particular, realiza copias de la configuración regional, los indicadores de formato, el contenido de los arreglos std::ios_base::iword y std::ios_base::pword (pero no los punteros iword y pword en sí mismos), las funciones de retorno, y el flujo vinculado.
3) Llama a cada callback registrado por register_callback() pasando copyfmt_event como parámetro.
4) Copia la máscara de excepciones de other a * this como si se llamara a exceptions ( other. exceptions ( ) ) .

Contenidos

Parámetros

otro - otro flujo para usar como fuente

Valor de retorno

* this

Notas

La segunda pasada a través de las devoluciones de llamada puede utilizarse para copiar en profundidad los objetos definidos por el usuario a los que apuntan los punteros en std::ios_base::pword .

copyfmt() puede utilizarse para guardar y restaurar el estado de un flujo. Boost proporciona una biblioteca de conservadores de estado de E/S más granular para el mismo propósito.

Ejemplo

Hace que el objeto std::ofstream "out" se comporte exactamente como std::cout , incluyendo formato, tie() con std::cin , etc.

#include <bitset>
#include <climits>
#include <fstream>
#include <iostream>
int main()
{
    std::ofstream out;
    out.copyfmt(std::cout); // copy everything except rdstate and rdbuf
    out.clear(std::cout.rdstate()); // copy rdstate
    out.basic_ios<char>::rdbuf(std::cout.rdbuf()); // share the buffer
    out << "Hello, world\n";
    auto bin = [](std::ios_base::fmtflags f)
    {
        return std::bitset<sizeof(std::ios_base::fmtflags) * CHAR_BIT>
            { static_cast<unsigned long long>(f) };
    };
    std::ofstream out2;
    std::cout << "1) out2.flags(): " << bin(out2.flags()) << '\n';
    std::cout << "2) cout.flags(): " << bin(std::cout.flags()) << '\n';
    std::cout.setf(std::ios::hex | std::ios::fixed | std::ios::boolalpha);
    std::cout << "3) cout.flags(): " << bin(std::cout.flags()) << '\n';
    out2.copyfmt(std::cout); // copy everything except rdstate and rdbuf
    std::cout << "4) out2.flags(): " << bin(out2.flags()) << '\n';
}

Salida posible:

Hello, world
1) out2.flags(): 00000000000000000001000000000010
2) cout.flags(): 00000000000000000001000000000010
3) cout.flags(): 00000000000000000001000000001111
4) out2.flags(): 00000000000000000001000000001111

Informes de defectos

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

DR Se aplica a Comportamiento publicado Comportamiento correcto
LWG 256 C++98 el paso 3 llamaba a las callbacks registradas con el
tipo de evento copy_event , que no está definido
corregido a
copyfmt_event
LWG 292 C++98 si other se refiere al mismo objeto que * this , los objetos miembro
aún se copiaban y las callbacks registradas aún se llamaban
no hacer nada
en este caso