table of contents
std::basic_ios::copyfmt(3) | C++ Standard Libary | std::basic_ios::copyfmt(3) |
NAME¶
std::basic_ios::copyfmt - std::basic_ios::copyfmt
Synopsis¶
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:
1) Calls every callback registered by register_callback() passing erase_event
as
parameter.
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.
3) Calls every callback registered by register_callback() passing
copyfmt_event as
parameter.
4) Copies the exception mask from other to *this as if by calling
exceptions(other.exceptions()).
Parameters¶
other - another stream to use as source
Return value¶
*this
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.
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
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 corrected to
event type copy_event, which is not defined copyfmt_event
if other refers to the same object as *this, the
LWG 292 C++98 member objects do nothing
were still copied and the registered callbacks in this case
were still called
2024.06.10 | http://cppreference.com |