std::basic_ios<CharT,Traits>::copyfmt
From cppreference.com
C++
Feature test macros (C++20)
Concepts library (C++20)
Metaprogramming library (C++11)
Ranges library (C++20)
Filesystem library (C++17)
Concurrency support library (C++11)
Execution control library (C++26)
Input/output library
Print functions (C++23)
Buffers
(C++23)
(C++98/26*)
(C++20)
Streams
Abstractions
File I/O
String I/O
Array I/O
(C++23)
(C++23)
(C++23)
(C++98/26*)
(C++98/26*)
(C++98/26*)
Synchronized Output
(C++20)
Types
Error category interface
(C++11)
(C++11)
std::basic_ios
Member functions
State functions
Formatting
basic_ios::copyfmt
Miscellaneous
Protected member functions
(C++11)
(C++11)
(C++11)
basic_ios& copyfmt( const basic_ios& other );
If other refers to the same object as *this, has no effects. Otherwise, copies the state of the stream other into *this. This is done in the following sequence:
2) Copies all member objects from other to *this except for rdstate() , the exception mask, and rdbuf() . In particular, makes copies of the locale, the formatting flags, the contents of the arrays std::ios_base::iword and std::ios_base::pword (but not the
iword
and pword
pointers themselves), the callbacks, and the tied stream.4) Copies the exception mask from other to *this as if by calling exceptions(other.exceptions()).
[edit] Parameters
other
-
another stream to use as source
[edit] Return value
*this
[edit] Notes
The second pass through the callbacks may be used to deep-copy the user-defined objects pointed to by the pointers in std::ios_base::pword .
copyfmt()
may be used to save and restore the state of a stream. Boost provides a more fine-grained I/O state savers library for the same purpose.
[edit] Example
Makes the std::ofstream object "out" behave exactly like std::cout , including formatting, tie()
to std::cin , etc.
Run this code
#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'; }
Possible output:
Hello, world 1) out2.flags(): 00000000000000000001000000000010 2) cout.flags(): 00000000000000000001000000000010 3) cout.flags(): 00000000000000000001000000001111 4) out2.flags(): 00000000000000000001000000001111
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 256 | C++98 | step 3 called the registered callbacks with the event type copy_event , which is not defined
|
corrected to copyfmt_event |
LWG 292 | C++98 | if other refers to the same object as *this, the member objects were still copied and the registered callbacks were still called |
do nothing in this case |