Delen via


Tekenreeks- en I/O-opmaak (modern C++)

C++ <iostream-klassen> , -functies en -operators ondersteunen geformatteerde tekenreeks-I/O. De volgende code laat bijvoorbeeld zien hoe u cout kunt instellen om een geheel getal op te maken voor uitvoer in hexadecimale notatie. Ten eerste wordt de huidige status opgeslagen om deze later opnieuw in te stellen, omdat zodra de opmaakstatus is doorgegeven cout, deze op die manier blijft totdat deze is gewijzigd. Het is niet alleen van toepassing op die ene regel code.

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

Deze benadering is typeveilig en uitbreidbaar, maar is ook complex en uitgebreid.

Alternatieve indelingsopties

Als alternatief kunt u deze gebruiken Boost.Format vanuit de Boost C++-bibliotheken, ook al is dit niet de standaard. U kunt elke Boost-bibliotheek downloaden van de Boost-website .

Enkele voordelen hiervan Boost.Format zijn:

  • Veilig: Type-veilig en genereert een uitzondering op fouten, bijvoorbeeld de specificatie van te weinig of te veel items.

  • Uitbreidbaar: werkt voor elk type dat kan worden gestreamd.

  • Handig: Standaard POSIX en vergelijkbare notatietekenreeksen.

Hoewel Boost.Format deze is gebouwd op C++ <iostream-faciliteiten> , die veilig en uitbreidbaar zijn, zijn ze niet geoptimaliseerd voor prestaties. Wanneer u prestatieoptimalisatie nodig hebt, kunt u C printf en sprintf overwegen, die snel en eenvoudig te gebruiken zijn. Ze zijn echter niet uitbreidbaar of veilig tegen beveiligingsproblemen. (Er bestaan veilige versies, maar er wordt een lichte prestatiestraf opgelegd. Zie printf_s, _printf_s_l, wprintf_s, _wprintf_s_l en sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l) voor meer informatie.

In de volgende code ziet u enkele van de boost-opmaakfuncties.

    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

Zie ook

Welkom terug in C++
Naslaginformatie over C++-taal
C++ Standaardbibliotheek
<iostream>
<grens>
<iomanip>