Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | io‎ | basic ios
 
 
 
 
basic_ios& copyfmt( const basic_ios& other );

Wenn other auf dasselbe Objekt wie *this verweist, hat dies keine Auswirkungen. Andernfalls werden die Zustände des Streams other in *this kopiert. Dies geschieht in der folgenden Reihenfolge:

1) Ruft jeden Callback auf, der von register_callback() mit erase_event als Parameter registriert wurde.
2) Kopiert alle Member-Objekte von other nach *this, mit Ausnahme von rdstate(), der Ausnahme-Maske und rdbuf(). Insbesondere werden Kopien der Locale, der Formatierungs-Flags, des Inhalts der Arrays std::ios_base::iword und std::ios_base::pword (aber nicht der `iword`- und `pword`-Zeiger selbst), der Callbacks und des verbundenen Streams erstellt.
3) Ruft jeden Callback auf, der von register_callback() mit copyfmt_event als Parameter registriert wurde.
4) Kopiert die Ausnahme-Maske von other nach *this, als ob exceptions(other.exceptions()) aufgerufen worden wäre.

Inhalt

[edit] Parameter

Sonstiges - Ein weiterer Stream, der als Quelle verwendet werden soll

[edit] Rückgabewert

*this

[edit] Hinweise

Der zweite Durchlauf durch die Callbacks kann verwendet werden, um die benutzerdefinierten Objekte, auf die von den Zeigern in std::ios_base::pword gezeigt wird, tief zu kopieren.

copyfmt() kann verwendet werden, um den Zustand eines Streams zu sichern und wiederherzustellen. Boost bietet eine feingranularere I/O-Zustands-Speicher-Bibliothek für denselben Zweck.

[edit] Beispiel

Bewirkt, dass das std::ofstream-Objekt "out" sich exakt wie std::cout verhält, einschließlich Formatierung, Verknüpfung mit std::cin über tie(), usw.

#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';
}

Mögliche Ausgabe

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

[edit] 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, die Member-Objekte
wurden trotzdem kopiert und die registrierten Callbacks wurden trotzdem aufgerufen
Nichts tun
in diesem Fall