Namespaces
Variants

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

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

Wenn other auf dasselbe Objekt wie * this verweist, hat dies keine Auswirkungen. Andernfalls wird der Zustand des Streams other in * this kopiert. Dies geschieht in der folgenden Reihenfolge:

1) Ruft jeden Callback auf, der durch register_callback() registriert wurde, und übergibt dabei erase_event als Parameter.
2) Kopiert alle Member-Objekte von other zu * this mit Ausnahme von rdstate() , der Exception-Maske und rdbuf() . Insbesondere werden Kopien der Locale, der Formatierungsflags, der Inhalte der Arrays std::ios_base::iword und std::ios_base::pword (aber nicht der iword - und pword -Zeiger selbst), der Callbacks und des gebundenen Streams erstellt.
3) Ruft jeden Callback auf, der durch register_callback() registriert wurde, und übergibt dabei copyfmt_event als Parameter.
4) Kopiert die Ausnahmemaske von other nach * this wie durch den Aufruf von exceptions ( other. exceptions ( ) ) .

Inhaltsverzeichnis

Parameter

other - ein weiterer Stream, der als Quelle verwendet werden soll

Rückgabewert

* this

Hinweise

Der zweite Durchlauf durch die Callbacks kann verwendet werden, um die benutzerdefinierten Objekte, auf die die Zeiger in std::ios_base::pword zeigen, tief zu kopieren.

copyfmt() kann verwendet werden, um den Zustand eines Streams zu speichern und wiederherzustellen. Boost bietet für denselben Zweck eine feiner abgestufte I/O State Savers -Bibliothek.

Beispiel

Lässt das std::ofstream -Objekt "out" sich genauso verhalten wie std::cout , einschließlich Formatierung, tie() an std::cin , usw.

#include <bitset>
#include <climits>
#include <fstream>
#include <iostream>
int main()
{
    std::ofstream out;
    out.copyfmt(std::cout); // alles außer rdstate und rdbuf kopieren
    out.clear(std::cout.rdstate()); // rdstate kopieren
    out.basic_ios<char>::rdbuf(std::cout.rdbuf()); // Puffer teilen
    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); // alles außer rdstate und rdbuf kopieren
    std::cout << "4) out2.flags(): " << bin(out2.flags()) << '\n';
}

Mögliche Ausgabe:

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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 256 C++98 Schritt 3 rief die registrierten Callbacks mit dem
Ereignistyp copy_event auf, der nicht definiert ist
korrigiert zu
copyfmt_event
LWG 292 C++98 wenn other auf dasselbe Objekt wie * this verweist, wurden die Memberobjekte
trotzdem kopiert und die registrierten Callbacks trotzdem aufgerufen
in diesem Fall
nichts tun