Spec-Zone.ru › C++

std::basic_ios<CharT,Traits>::copyfmt

basic_ios& copyfmt( const basic_ios& other );

Если other ссылается на тот же объект, что и *this, функция ничего не делает. В противном случае копирует состояние потока other в *this. Это выполняется в следующем порядке:

1) Вызывает каждый обратный вызов, зарегистрированный с помощью register_callback(), передавая erase_event в качестве параметра.
2) Копирует все объекты-члены из other в *this, кроме rdstate(), маски исключений и rdbuf(). В частности, копируются локаль, флаги форматирования, содержимое массивов std::ios_base::iword и std::ios_base::pword (но не сами указатели iword и pword), обратные вызовы и связанный поток.
3) Вызывает каждый обратный вызов, зарегистрированный с помощью register_callback(), передавая copyfmt_event в качестве параметра.
4) Копирует маску исключений из 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API