Condividi tramite


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

Le classi, le funzioni e gli operatori iostream> C++ <supportano l'I/O di stringa formattata. Ad esempio, il codice seguente illustra come impostare per formattare cout un numero intero per l'output in formato esadecimale. Prima di tutto, salva lo stato corrente per reimpostarlo in seguito, perché una volta passato lo stato del formato a , rimane così fino a coutquando non viene modificato. Non si applica solo a 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
}

Questo approccio è indipendente dai tipi ed estendibile, ma è anche complesso e dettagliato.

Opzioni di formato alternativo

In alternativa, è possibile usare Boost.Format dalle librerie Boost C++, anche se non è standard. È possibile scaricare qualsiasi libreria Boost dal sito Web Boost .

Alcuni vantaggi di Boost.Format sono:

  • Safe: indipendente dai tipi e genera un'eccezione per gli errori, ad esempio la specifica di troppi o troppi elementi.

  • Estendibile: funziona per qualsiasi tipo che può essere trasmesso in streaming.

  • Pratico: POSIX standard e stringhe di formato simili.

Anche se Boost.Format si basa su strutture iostream> C++<, che sono sicure ed estendibili, non sono ottimizzate per le prestazioni. Quando è necessaria l'ottimizzazione delle prestazioni, prendere in considerazione C printf e sprintf, che sono veloci e facili da usare. Tuttavia, non sono estendibili o sicuri dalle vulnerabilità. Le versioni sicure esistono, ma comportano una lieve riduzione delle prestazioni. Per altre informazioni, vedere printf_s, _printf_s_l, wprintf_s, _wprintf_s_l e sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l).

Il codice seguente illustra 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

Vedi anche

Benvenuto in C++
Riferimenti al linguaggio C++
Libreria standard C++
<iostream>
<limits>
<iomanip>