Cadeia de caracteres e formatação de E/S (C++ moderno)

Classes, funções e operadores de <iostream> em C++ dão suporte a E/S de cadeia de caracteres formatada. Por exemplo, o código a seguir mostra como definir cout para formatar um inteiro para saída em hexadecimal. Primeiro, ele salva o estado atual para redefini-lo posteriormente, pois quando o estado de formato é passado para cout, ele permanece assim até que seja alterado. Ele não se aplica apenas a uma linha de código.

#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
}

Essa abordagem é fortemente tipada e extensível, mas também é complexa e detalhada.

Opções de formato alternativo

Como alternativa, você pode usar Boost.Format nas bibliotecas de C++ do Boost, mesmo que não seja padrão. É possível baixar qualquer biblioteca do Boost do site do Boost.

Algumas vantagens de Boost.Format são:

  • Segurança: fortemente tipado e gera uma exceção para erros, por exemplo, a especificação de muito poucos itens ou um número excessivo de itens.

  • Extensível: funciona para qualquer tipo que possa ser transmitido por streaming.

  • Conveniente: POSIX padrão e cadeias de caracteres de formato semelhante.

Embora Boost.Format seja compilado em instalações de <iostream> em C++, que são seguras e extensíveis, eles não são otimizados para desempenho. Quando a otimização de desempenho for necessária, considere printf e sprintf em C, que são rápidos e fáceis de usar. No entanto, eles não são extensíveis ou seguros contra vulnerabilidades. (Existem versões seguras, mas elas incorrem em uma pequena penalidade de desempenho. Para saber mais, confira printf_s, _printf_s_l, wprintf_s, _wprintf_s_l e sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l).

O código a seguir demonstra alguns dos recursos de formatação do 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

Confira também

Bem-vindo outra vez ao C++
Referência da linguagem C++
Biblioteca Padrão do C++
<iostream>
<limits>
<iomanip>