std::basic_ios<CharT,Traits>::copyfmt
basic_ios& copyfmt( const basic_ios& other ); |
Если other ссылается на тот же объект, что и *this, функция ничего не делает. В противном случае копирует состояние потока other в *this. Это выполняется в следующем порядке:
register_callback(), передавая erase_event в качестве параметра.other в *this, кроме rdstate(), маски исключений и rdbuf(). В частности, копируются локаль, флаги форматирования, содержимое массивов std::ios_base::iword и std::ios_base::pword (но не сами указатели iword и pword), обратные вызовы и связанный поток.register_callback(), передавая copyfmt_event в качестве параметра.other в *this, как если бы был вызван exceptions(other.exceptions()).Параметры
| other | - | другой поток, используемый в качестве источника |
Возвращаемое значение
*this
Примечания
Второй проход по обратным вызовам можно использовать для глубокого копирования пользовательских объектов, на которые указывают указатели в std::ios_base::pword.
copyfmt() можно использовать для сохранения и восстановления состояния потока. Boost предоставляет библиотеку средств сохранения состояния ввода-вывода для той же цели, обеспечивающую более точный контроль.
Пример
Заставляет объект std::ofstream "out" вести себя точно так же, как std::cout, включая форматирование, tie() с std::cin и т. д.
#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';
}
Возможный вывод:
Hello, world 1) out2.flags(): 00000000000000000001000000000010 2) cout.flags(): 00000000000000000001000000000010 3) cout.flags(): 00000000000000000001000000001111 4) out2.flags(): 00000000000000000001000000001111
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применяется к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 256 | C++98 | На шаге 3 зарегистрированные обратные вызовы вызывались с типом событияcopy_event, который не определён | исправлено наcopyfmt_event |
| LWG 292 | C++98 | если other ссылается на тот же объект, что и *this, объекты-членывсё равно копировались, а зарегистрированные обратные вызовы всё равно вызывались | в этом случае ничего не делать |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_ios/copyfmt