std::basic_ios<CharT,Traits>::copyfmt
basic_ios& copyfmt( const basic_ios& other ); |
||
Si other hace referencia al mismo objeto que *this, no tiene ningún efecto. De lo contrario, copia el estado del flujo other en *this. Esto se hace en la siguiente secuencia:
other a *this excepto rdstate(), la máscara de excepción y rdbuf(). En particular, realiza copias de la configuración regional, los indicadores de formato, el contenido de los arrays std::ios_base::iword y std::ios_base::pword (pero no los punteros iword y pword en sí), las devoluciones de llamadas y el flujo vinculado.other a *this como si llamara a exceptions(other.exceptions()).Parámetros
| other | - | Otro flujo a usar como fuente. |
Valor de retorno
*this
Notas
El segundo paso a través de las devoluciones de llamadas se puede utilizar para realizar una copia profunda de los objetos definidos por el usuario a los que apuntan los punteros en std::ios_base::pword.
copyfmt() se puede utilizar para guardar y restaurar el estado de una secuencia. Boost ofrece una biblioteca de protectores de estado de E/S más detallada para el mismo propósito.
Ejemplo
Hace que el objeto std::ofstream "out" se comporte exactamente como std::cout, incluido el formato, tie() a std::cin, etc.
#include <bitset>
#include <climits>
#include <fstream>
#include <iostream>
int main()
{
std::ofstream out;
out.copyfmt(std::cout); // copiar todo excepto rdstate y rdbuf
out.clear(std::cout.rdstate()); // copiar rdstate
out.basic_ios<char>::rdbuf(std::cout.rdbuf()); // compartir el búfer
out << "Hola, mundo\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); // copiar todo excepto rdstate y rdbuf
std::cout << "4) out2.flags(): " << bin(out2.flags()) << '\n';
}
Posible salida:
Hola, mundo
1) out2.flags(): 00000000000000000001000000000010
2) cout.flags(): 00000000000000000001000000000010
3) cout.flags(): 00000000000000000001000000001111
4) out2.flags(): 00000000000000000001000000001111
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 256 | C++98 | El paso 3 llama a las devoluciones de llamadas registradas con el tipo de evento copy_event, que no está definido.
|
Corregido a copyfmt_event. |
| LWG 292 | C++98 | Si other hace referencia al mismo objeto que *this, los objetosmiembro se copiaron de todas formas y las devoluciones de llamadas registradas se llamaron de todas formas. |
No hacer nada en este caso. |