Dela via


Sträng- och I/O-formatering (modern C++)

C++ <iostream-klasser> , funktioner och operatorer stöder formaterad sträng-I/O. Följande kod visar till exempel hur du anger cout för att formatera ett heltal till utdata i hexadecimalt. Först sparar den det aktuella tillståndet för att återställa det efteråt, eftersom när formattillståndet har överförts till coutförblir det så tills det har ändrats. Den gäller inte bara för den enda kodraden.

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

Den här metoden är typsäker och utökningsbar, men den är också komplex och utförlig.

Alternativ för alternativformat

Alternativt kan du använda Boost.Format från Boost C++-biblioteken, även om det inte är standard. Du kan ladda ned alla Boost-bibliotek från Boost-webbplatsen .

Några fördelar Boost.Format med är:

  • Säker: Typsäker och genererar ett undantag för fel, till exempel angivelsen av för få eller för många föremål.

  • Utökningsbar: Fungerar för alla typer som kan strömmas.

  • Bekvämt: Standard POSIX och liknande formatsträngar.

Även om Boost.Format är byggt på C++ <iostream-funktioner>, som är säkra och utökningsbara, är de inte prestandaoptimerade. När du behöver prestandaoptimering bör du överväga C printf och sprintf, som är snabba och enkla att använda. De är dock inte utökningsbara eller säkra från sårbarheter. (Det finns säkra versioner, men de medför en liten prestandapåverkan. Mer information finns printf_s, _printf_s_l, wprintf_s, _wprintf_s_l och sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l).

Följande kod visar några av funktionerna för boost-formatering.

    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

Se även

Välkommen tillbaka till C++
C++-språkreferens
C++-standardbibliotek
<iostream>
<Gränser>
<iomanip>