I/O manipulators | ||||
Print functions(C++23) | ||||
C-style I/O | ||||
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) |
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); | ||
Ifother refers to the same object as*this, has no effects. Otherwise, copies the state of the streamother into*this. This is done in the following sequence:
iword
andpword
pointers themselves), the callbacks, and the tied stream.Contents |
other | - | another stream to use as source |
*this
The second pass through the callbacks may be used to deep-copy the user-defined objects pointed to by the pointers instd::ios_base::pword.
copyfmt()
may be used to save and restore the state of a stream. Boost provides a more fine-grainedI/O state savers library for the same purpose.
Makes thestd::ofstream object "out" behave exactly likestd::cout, including formatting,tie()
tostd::cin, etc.
#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){returnstd::bitset<sizeof(std::ios_base::fmtflags)*CHAR_BIT>{static_cast<unsignedlonglong>(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 rdbufstd::cout<<"4) out2.flags(): "<< bin(out2.flags())<<'\n';}
Possible output:
Hello, world1) out2.flags(): 000000000000000000010000000000102) cout.flags(): 000000000000000000010000000000103) cout.flags(): 000000000000000000010000000011114) out2.flags(): 00000000000000000001000000001111
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 | ifother 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 |