Поделиться через


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

Потоки iostream в 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.Format:

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

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

  • Удобство: стандартный POSIX и подобные строки формата.

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

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

    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

См. также

Ссылки

<iostream>

<limits>

<iomanip>

Другие ресурсы

Возвращение к C++ (современный C++)

Справочник по языку C++

Справочник по стандартной библиотеке C++