Introduktion till streambaserad I/O
Tillståndet hos ett utmatnings streamobjekt (som t.ex. cout) avgör hur utskriften kommer att formateras. Ett streamobjekt har ett antal instansvariabler som håller reda på dess tillstånd (formatflaggor). Tillståndet hos ett streamobjekt kan förändras genom att man skickar meddelanden till det eller då det svarar på en speciell sorts objekt kallade manipulatorer.
Här följer en lista av de metoder och motsvarande manipulatorer som kan användas för att förändra tillståndet hos en stream:
Medlemsmetoder Manipulatorer width() setw() Sätt utmatningsvidden för nästa utskrift fill() setfill() Sätt utfyllnadstecken precision() setprecision() Sätt flyttals precision vid utskrift setf() setiosflags() Slå på en formatflagga unsetf() resetiosflags() Slå av en formatflaggaManipulatorerna är definierade i manipulatorbiblioteket
Genom att anropa medlemsmetoden width() så ändras utskriftfältets vidd för nästa utskrift.
cout.width(8); cout << 3 << "Hello";Alternativt kan man skicka manipulatorn setw() till streamen:
cout << setw(8) << 3 << "Hello";I båda fallen så genereras följande utskrift där trean är högerjusterad och föregås av sju blankslag (eller annan specificerat utfyllnadstecken) samt där texten "Hello" följer direkt efter.
[ 3Hello ]Observera att man endast ändrat fältvidden för nästa objekt som skrivs ut (det är därför texten "Hello" inte inleds med blansslag. Den defaulta fältvidden är noll.
ios::left Vänsterjustering ios::right Högerjustering ios::adjustfield Slå av alla andra justeringsflaggorExempel (medlemsmetoder)
cout.setf(ios::left, ios::adjustfield); cout.width(8); cout << 3; cout.width(8); cout << "Hello";Exempel (manipulatorer)
cout << setiosflags(ios::left, ios::adjusffield)
<< setw(8) << 3 << setw(8) << "Hello";
I båda fallen så genereras en utskrift där trean är vänsterjusterad och efterföljs av sju utfyllnadstecken (default
blankslag) samt där texten följer direkt efter och också den efterföljs av tre utfyllnadstecken:
[3 Hello ]Förändringen av justeringsflaggorna hos ett streamobjekt är permanent och gäller till nästa ändring, för att slå av en justeringsflagga kan medlemsmetoden unsetf() eller manipulatorn unsetiosflags() användas.
Exempel med medlemsmetoder:
cout.fill('#');
cout.setf(ios::left, ios::adjustfield);
cout.width(8);
cout << 3;
cout.width(8);
cout << "Hello";
Samma exempel med manipulatorer:
cout << setfill('#') << setiosflags(ios::left, ios::adjusffield)
<< setw(8) << 3 << setw(8) << "Hello";
I båda fallen så genereras en utskrift där talet och texten är vänsterjusterade och utfyllda med utfyllnadstecken:
[3#######Hello### ]
fixed (fixerat antal decimaler) scientific (vetenskapligt) defaultMed följande flyttalsformatsflaggor kan man styra formateringen av flyttal vid utskriften:
ios::fixed Slå på flaggan för fixed flyttalsformat ios::scientific Slå på flaggan för scientific flyttalsformat ios::floatfield Slå av övriga flyttalsformatsflaggorFlaggorna slås på och av som vanligt med medlemsmetoderna setf() och unsetf() samt manipulatorerna setiosflags() och unsetiosflags(). Antalet decimaler i ett flyttal kan styras med medlemsmetoden precision() eller manipulatorn precision(), vill man även att avslutande nollor i ett decimaltal skall skrivas ut måste flaggan
ios::showpointsättas.
Med medlemnsmetoder:
cout.setf(ios::fixed, ios::floatfield); cout.precision(3); cout << 12.34567 << ' ' << 12.5 << endl; cout.seft(ios::showpoint); cout << 12.34567 << ' ' << 12.5 << endl; cout.setf(ios::scientific, ios::floatfield); cout << 12.34567 << ' ' << 12.5 << endl;Eller med manipulatorer:
cout << setiosflags(ios::fixed, ios::floatfield) << setprecision(3)
<< 12.34567 << ' ' << 12.5 << endl;
<< sefiosflags(ios::showpoint)
<< 12.34567 << ' ' << 12.5 << endl
<< setiosflags(ios::scientific, ios::floatfield)
<< 12.34567 << ' ' << 12.5 << endl;
Utskrift:
[12.345 12.5 ] [12.345 12.500 ] [1.234e+01 1.250e+01 ]
int n = 11; cout << dec << n << ' ' << oct << n << ' ' << hex << n; cout.setf(ios::showbase); cout << dec << n << ' ' << oct << n << ' ' << hex << n;Följande utskrift genereras:
[11 13 b ] [11 013 0xb ]