home | help
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  se-
     quence:

	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 for-
     matting 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 copy-
     fmt_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, in-
     cluding
	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	retroac-
     tively to
	previously published C++ standards.

	  DR	Applied to		Behavior as published		    Cor-
     rect behavior
	LWG 256 C++98	   step 3 called the registered callbacks with the  cor-
     rected 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

http://cppreference.com 	   2024.06.10	      std::basic_ios::copyfmt(3)

home | help