Formato de cadena y de E/S (C++ moderno)
iostreams de C++ admiten cadena con formato E/S. Por ejemplo, el código siguiente muestra cómo establecer cout para dar formato a un entero y así generarlo como hexadecimal, guardándolo en primer guardar fuera del estado actual y estableciéndolo de nuevo después, ya que una vez que el formato de estado se pasa a cout, permanece así hasta que se cambie, no solo para la única línea 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
}
Esto puede ser demasiado complejo en muchos casos. Como alternativa, puede utilizar Boost.Format de las bibliotecas Boost de C++, aunque no sea estándar. Puede descargar cualquier biblioteca de Boost desde el sitio web de Boost.
Algunas ventajas de Boost.Format son:
Seguro: seguro de tipos y produce una excepción para errores; por ejemplo, la especificación de muy pocos elementos o de demasiados elementos.
Extensible: funciona para cualquier tipo con el que se pueda hacer streaming.
Adecuado: Posix estándar y cadenas de formato similares.
Aunque Boost.Format está compilado en C++ iostreams, de forma segura y extensible, no están optimizados para su rendimiento. Al requerir la optimización del rendimiento, considere printf y sprintf de C, que son rápidos y fáciles de usar. Sin embargo, no son extensibles ni están seguros ante vulnerabilidades. (Las versiones seguras existen, pero incurren en una ligera disminución del rendimiento. Para obtener más información, vea printf_s, _printf_s_l, wprintf_s, _wprintf_s_l y sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l.
El código siguiente muestra algunas de las características de formato 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