Форматирование строк и ввода-вывода (современный C++)

Классы, функции и операторы C++ <> поддерживают форматированные операции ввода-вывода строки. Например, в следующем коде показано, как задать cout формат целого числа для вывода в шестнадцатеричном формате. Во-первых, он сохраняет текущее состояние, чтобы сбросить его после этого, так как после того как состояние формата передается cout, оно остается таким образом, пока не изменится. Он не просто применяется к одной строке кода.

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    ios state(nullptr);

    cout << "The answer in decimal is: " << 42 << endl;

    state.copyfmt(cout); // save current formatting
    cout << "In hex: 0x" // now load up a bunch of formatting modifiers
        << hex
        << uppercase
        << setw(8)
        << setfill('0')
        << 42            // the actual value we wanted to print out
        << endl;
    cout.copyfmt(state); // restore previous formatting
}

Этот подход является типобезопасным и расширяемым, но он также сложный и подробный.

Альтернативные параметры формата

В качестве альтернативы можно использовать Boost.Format из библиотек Boost C++, даже если это нестандартно. Вы можете скачать любую библиотеку Boost с веб-сайта Boost .

Ниже приведены некоторые Boost.Format преимущества.

  • Сейф: типобезопасный и создает исключение для ошибок, например спецификацию слишком мало или слишком много элементов.

  • Расширяемый: работает для любого типа, который может быть потоковой передачи.

  • Удобно: стандартные строки формата POSIX и аналогичные строки формата.

Хотя Boost.Format он построен на объектах iostream> C++<, которые являются безопасными и расширяемыми, они не оптимизированы для производительности. Если требуется оптимизация производительности, рассмотрите возможность печати C и sprintf, которые являются быстрыми и простыми в использовании. Однако они не являются расширяемыми или безопасными от уязвимостей. (Сейф версии существуют, но они несут небольшую пенальти производительности. Дополнительные сведения см. в разделе printf_s, _printf_s_l, wprintf_s, _wprintf_s_l и sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l).

В следующем коде показаны некоторые функции форматирования boost.

    string s = str( format("%2% %2% %1%\n") % "world" % "hello" );
    // s contains "hello hello world"

    for( auto i = 0; i < names.size(); ++i )
        cout << format("%1% %2% %|40t|%3%\n") % first[i] % last[i] % tel[i];
    // Georges Benjamin Clemenceau             +33 (0) 123 456 789
    // Jean de Lattre de Tassigny              +33 (0) 987 654 321

См. также

Возвращение к C++
Справочник по языку C++
Стандартная библиотека C++
<iostream>
<limits>
<iomanip>