| 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 |