Condividi tramite


Formattazione di stringhe e I/O (C++ moderno)

Gli iostream di C++ supportano I/O di stringa formattati. Ad esempio, nel codice seguente viene illustrato come impostare il cout per formattare un Integer da restituire in valore esadecimale, primo salvando lo stato corrente e reimpostandolo in seguito, poiché una volta passata la formattazione di stato su cout, resta uguale fino alla modifica, non solo per una riga di codice.

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

In molti casi questa situazione può essere troppo complessa. In alternativa, è possibile utilizzare Boost.Format dalle librerie Boost di C++, anche se non si tratta di uno standard. È possibile scaricare qualsiasi libreria Boost dal sito Web Boost.

Alcuni vantaggi di Boost.Format sono:

  • Sicurezza: indipendente dai tipi e genera un'eccezione per gli errori, ad esempio la specifica di un numero eccessivo o insufficiente di elementi.

  • Estensibile: funziona per qualsiasi tipo che può essere trasmesso.

  • Utile: POSIX standard e stringhe di formato simili.

Sebbene Boost.Format venga compilato negli iostream di C++ (i quali sono sicuri ed estensibili), le prestazioni che essi offrono non sono ottimizzate. Quando è necessario ottimizzare le prestazioni, considerare printf e sprintf del linguaggio C, che sono veloci e semplici da utilizzare. Tuttavia, non sono estendibili o senza vulnerabilità. Le versioni sicure esistono, ma comportano una lieve riduzione delle prestazioni. Per ulteriori informazioni, vedere printf_s, _printf_s_l, wprintf_s, _wprintf_s_l e sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l).

Nel codice seguente vengono illustrate alcune delle funzionalità di formattazione 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

Vedere anche

Riferimenti

<iostream>

<limits>

<iomanip>

Altre risorse

C++ (C++ moderno)

Riferimenti del linguaggio C++

Riferimento per la libreria standard C++