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