Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp wordt beschreven hoe u de indeling bepaalt en hoe u invoegoperators voor uw eigen klassen maakt. De invoegoperator (<<) die vooraf is geprogrammeerd voor alle standaard C++-gegevenstypen, verzendt bytes naar een uitvoerstroomobject. Invoegoperators werken met vooraf gedefinieerde 'manipulators'. Dit zijn elementen die de standaardindeling van argumenten voor gehele getallen wijzigen.
U kunt de indeling beheren met de volgende opties:
Uitvoerbreedte
Als u uitvoer wilt uitlijnen, geeft u de uitvoerbreedte voor elk item op door de setw manipulator in de stroom te plaatsen of door de functie width lid aan te roepen. In dit voorbeeld worden de waarden in een kolom ten minste tien tekens breed uitgelijnd:
// output_width.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
for( int i = 0; i < 4; i++ )
{
cout.width(10);
cout << values[i] << '\n';
}
}
1.23
35.36
653.7
4358.24
Voorloopspaties worden toegevoegd aan een waarde van minder dan 10 tekens breed.
Als u een veld wilt opvullingen, gebruikt u de functie fill lid, waarmee de waarde van het opvullingsteken wordt ingesteld voor velden met een opgegeven breedte. De standaardwaarde is leeg. Als u de kolom met getallen met sterretjes wilt opmaken, wijzigt u de vorige for lus als volgt:
for (int i = 0; i <4; i++)
{
cout.width(10);
cout.fill('*');
cout << values[i] << endl;
}
De endl manipulator vervangt het nieuwe regelteken ('\n'). De uitvoer ziet er als volgt uit:
******1.23
*****35.36
*****653.7
***4358.24
Als u breedten wilt opgeven voor gegevenselementen in dezelfde regel, gebruikt u de setw manipulator:
// setw.cpp
// compile with: /EHsc
#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
const char *names[] = { "Zoot", "Jimmy", "Al", "Stan" };
for( int i = 0; i < 4; i++ )
cout << setw( 7 ) << names[i]
<< setw( 10 ) << values[i] << endl;
}
De functie width lid wordt gedeclareerd in <iostream>. Als u setw of een andere manipulator met argumenten gebruikt, moet u <iomanip>opnemen. In de uitvoer worden tekenreeksen afgedrukt in een veld met breedte 7 en gehele getallen in een veld met breedte 10:
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
setw en width geen waarden afkappen. Als de opgemaakte uitvoer de breedte overschrijdt, wordt de volledige waarde afgedrukt, afhankelijk van de precisie-instelling van de stroom. Zowel setw als width zijn alleen van invloed op het volgende veld. De veldbreedte wordt teruggezet naar het standaardgedrag (de benodigde breedte) nadat één veld is afgedrukt. De andere opties voor streamindeling blijven echter van kracht totdat ze zijn gewijzigd.
Uitlijning
Uitvoerstromen zijn standaard ingesteld op rechts uitgelijnde tekst. Als u de namen in het vorige voorbeeld links wilt uitlijnen en de getallen rechts wilt uitlijnen, vervangt u de for lus als volgt:
for (int i = 0; i <4; i++)
cout << setiosflags(ios::left)
<< setw(6) << names[i]
<< resetiosflags(ios::left)
<< setw(10) << values[i] << endl;
De uitvoer ziet er als volgt uit:
Zoot 1.23
Jimmy 35.36
Al 653.7
Stan 4358.24
De vlag links uitlijnen wordt ingesteld met behulp van de setiosflags manipulator met de left opsomming. Deze enumerator wordt gedefinieerd in de klasse ios, dus de verwijzing moet het ios:: voorvoegsel bevatten. Met de resetiosflags manipulator wordt de vlag links uitlijnen uitgeschakeld. In tegenstelling tot width en setwis het effect van setiosflags en resetiosflags permanent.
Precisie
De standaardwaarde voor precisie van drijvende komma is zes. Het getal 3466.9768 wordt bijvoorbeeld afgedrukt als 3466,98. Als u de manier wilt wijzigen waarop deze waarde wordt afgedrukt, gebruikt u de setprecision manipulator. De manipulator heeft twee vlaggen: fixed en scientific. Als fixed is ingesteld, wordt het getal afgedrukt als 3466,976800. Als scientific is ingesteld, wordt deze afgedrukt als 3,4669773+003.
Als u de getallen met drijvende komma wilt weergeven die worden weergegeven in Uitlijning door één significant cijfer, vervangt u de for lus als volgt:
for (int i = 0; i <4; i++)
cout << setiosflags(ios::left)
<< setw(6)
<< names[i]
<< resetiosflags(ios::left)
<< setw(10)
<< setprecision(1)
<< values[i]
<< endl;
In het programma wordt deze lijst afgedrukt:
Zoot 1
Jimmy 4e+01
Al 7e+02
Stan 4e+03
Als u wetenschappelijke notatie wilt elimineren, voegt u deze instructie in vóór de for lus:
cout << setiosflags(ios::fixed);
Met een vaste notatie wordt het programma afgedrukt met één cijfer na het decimaalteken.
Zoot 1.2
Jimmy 35.4
Al 653.7
Stan 4358.2
Als u de ios::fixed vlag wijzigt in ios::scientific, wordt dit in het programma afgedrukt:
Zoot 1.2e+00
Jimmy 3.5e+01
Al 6.5e+02
Stan 4.4e+03
Nogmaals, het programma drukt één cijfer na het decimaalteken af. Als ios::fixed of ios::scientific is ingesteld, bepaalt de precisiewaarde het aantal cijfers achter de komma. Als geen van beide markeringen is ingesteld, bepaalt de precisiewaarde het totale aantal significante cijfers. De resetiosflags manipulator wist deze vlaggen.
Radix
De dec, octen hex manipulators stellen de standaard radix in voor invoer en uitvoer. Als u bijvoorbeeld de hex manipulator in de uitvoerstroom invoegt, vertaalt het object de interne gegevensweergave van gehele getallen correct in een hexadecimale uitvoerindeling. De getallen worden weergegeven met cijfers tot en met f in kleine letters als de vlag uppercase leeg is (de standaardinstelling); anders worden ze weergegeven in hoofdletters. De standaard radix is dec (decimaal).
Tekenreeksen tussen aanstekens (C++14)
Wanneer u een tekenreeks invoegt in een stroom, kunt u eenvoudig dezelfde tekenreeks terughalen door de functie stringstream::str() lid aan te roepen. Als u echter de extractieoperator wilt gebruiken om de stroom op een later moment in te voegen in een nieuwe tekenreeks, krijgt u mogelijk een onverwacht resultaat omdat de operator >> standaard stopt wanneer het eerste spatieteken wordt gevonden.
std::stringstream ss;
std::string inserted = "This is a sentence.";
std::string extracted;
ss << inserted;
ss >> extracted;
std::cout << inserted; // This is a sentence.
std::cout << extracted; // This
Dit gedrag kan handmatig worden opgelost, maar om tekenreeks round-tripping handiger te maken, voegt C++14 de std::quoted stream manipulator toe in <iomanip>. Bij invoeging plaatst quoted() de tekenreeks tussen een scheidingsteken (standaard dubbele aanhalingsteken ' ' ) en bij extractie wordt de stroom bewerkt om alle tekens te extraheren totdat het uiteindelijke scheidingsteken is gevonden. Eventuele ingesloten aanhalingstekens worden met een escapeteken ('\\' standaard) ge escaped.
De scheidingstekens zijn alleen aanwezig in het stroomobject; ze zijn niet aanwezig in de geëxtraheerde tekenreeks, maar ze zijn aanwezig in de tekenreeks die wordt geretourneerd door basic_stringstream::str.
Het witruimtegedrag van de invoeg- en extractiebewerkingen is onafhankelijk van de weergave van een tekenreeks in code, dus de operator tussen aanhalingstekens is handig, ongeacht of de invoertekenreeks een letterlijke tekenreeks of een gewone tekenreeks is. De invoertekenreeks, ongeacht de indeling, kan ingesloten aanhalingstekens, regeleinden, tabbladen enzovoort bevatten, en al deze worden bewaard door de quoted() manipulator.
Zie quotedvoor meer informatie en voorbeelden van volledige code.