Formato de cadena y de E/S (C++ moderno)

Las clases, funciones y operadores iostream<> de C++ admiten E/S de cadena con formato. Por ejemplo, el siguiente código muestra cómo establecer cout para dar formato hexadecimal a la salida de un entero. En primer lugar, guarda el estado actual para restablecerlo más adelante, ya que una vez que el estado de formato pasa a cout, permanece así hasta que se cambia. No se aplica simplemente a una 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
}

Este método es seguro para tipos y extensible, pero también profuso y complejo.

Alternativas de formato

Como alternativa, se puede usar Boost.Format de las bibliotecas Boost de C++, aunque no sea estándar. Puede descargar cualquier biblioteca Boost del sitio web de Boost.

Estas son algunas ventajas de Boost.Format:

  • Seguro: es seguro para tipos y produce una excepción en caso de error, por ejemplo, si se especifican demasiados elementos o no los suficientes.

  • Extensible: funciona con cualquier tipo que se pueda transmitir.

  • Conveniente: POSIX estándar y cadenas de formato similares.

Aunque Boost.Format se basa en iostream<> de C++, que es seguro y extensible, no están optimizadas para el rendimiento. Cuando necesite optimizar el rendimiento, considere la posibilidad de usar printf y sprintf de C, que son funciones rápidas y fáciles de usar. Sin embargo, no son extensibles ni son seguras ante vulnerabilidades. (Existen versiones seguras, pero conllevan cierto detrimento 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).

En el siguiente código se muestran algunas de las características del 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

Consulte también

Aquí está otra vez C++
Referencia del lenguaje C++
Biblioteca estándar de C++
<iostream>
<limits>
<iomanip>