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

DR Применено к Поведение при публикации Правильное поведение
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/w/cpp/io/basic_ios/copyfmt

Spec-Zone.ru

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