Namespaces
Variants

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

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

Si other fait référence au même objet que * this , n'a aucun effet. Sinon, copie l'état du flux other dans * this . Ceci est effectué dans l'ordre suivant :

1) Appelle chaque callback enregistré par register_callback() en passant erase_event comme paramètre.
2) Copie tous les objets membres de other vers * this à l'exception de rdstate() , du masque d'exception et de rdbuf() . En particulier, effectue des copies des paramètres régionaux, des indicateurs de formatage, du contenu des tableaux std::ios_base::iword et std::ios_base::pword (mais pas des pointeurs iword et pword eux-mêmes), des fonctions de rappel et du flux lié.
3) Appelle chaque callback enregistré par register_callback() en passant copyfmt_event comme paramètre.
4) Copie le masque d'exception de other vers * this comme en appelant exceptions ( other. exceptions ( ) ) .

Table des matières

Paramètres

autre - un autre flux à utiliser comme source

Valeur de retour

* this

Notes

Le deuxième passage à travers les rappels peut être utilisé pour copier en profondeur les objets définis par l'utilisateur pointés par les pointeurs dans std::ios_base::pword .

copyfmt() peut être utilisé pour sauvegarder et restaurer l'état d'un flux. Boost fournit une bibliothèque de sauvegardes d'état d'E/S plus granulaires pour le même usage.

Exemple

Fait en sorte que l'objet std::ofstream "out" se comporte exactement comme std::cout , y compris le formatage, tie() avec 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';
}

Sortie possible :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 256 C++98 l'étape 3 appelait les callbacks enregistrés avec
le type d'événement copy_event , qui n'est pas défini
corrigé en
copyfmt_event
LWG 292 C++98 si other fait référence au même objet que * this , les objets membres
étaient toujours copiés et les callbacks enregistrés étaient toujours appelés
ne rien faire
dans ce cas