Compartilhar via


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

C++ iostreams são compatíveis com a E/S da cadeia de caracteres formatada. Por exemplo, o código a seguir mostra como definir o cout para formatar um inteiro para a saída em hexadecimal, primeiro salvando fora do estado atual e restaurando posteriormente, pois uma vez que a formatação de estado tenha passado para o cout, ele ficará dessa maneira até que seja alterado, não apenas para 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
}

Isso pode ser totalmente inconveniente em muitos casos. Como alternativa, você pode usar Boost.Format das bibliotecas Boost C++, mesmo que seja diferente do padrão. É possível baixar qualquer biblioteca Boost do site Boost.

Algumas vantagens de Boost.Format são:

  • Segurança: segurança de tipo e lança uma exceção para erros — por exemplo, a especificação é falta de itens ou itens em excesso.

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

  • Conveniente: Posix padrão e cadeias de caracteres de formatos semelhantes.

Embora Boost.Format seja compilado em C++ iostreams, que são seguros e extensíveis, não são otimizados para desempenho. Ao solicitar a otimização de desempenho, considere printf e sprintf do C, que são rápidos e fáceis de usar. No entanto, elas não são extensíveis nem seguros contra vulnerabilidades. (Existem versões seguras, mas elas têm uma pequena penalidade de desempenho.) Para obter mais informações, consulte 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 de 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

Consulte também

Referência

<iostream>

<limits>

<iomanip>

Outros recursos

Bem-vindo ao C++ (C++ moderno)

Referência de linguagem C++

Referência da Biblioteca Padrão C++