std::basic_ios<CharT,Traits>::copyfmt
| 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:
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 |