ios::floatfield | effect |
---|---|
ios::scientific | Display floating-point numbers in scientific format. Precision field indicates number of digits after the decimal point. |
ios::fixed | Display floating-point numbers in fixed format. Precision field indicates number of digits after the decimal point. |
"automatic" (Neither bit is set.) | Precision field indicates the total number of significant digits. |
ios::adjustfield | Effect |
---|---|
ios::left | Left-align values; pad on the right with the fill character. |
ios::right | Right-align values. Pad on the left with the fill character. This is the default alignment. |
ios::internal | Add fill characters after any leading sign or base indicator, but before the value. (In other words, the sign, if printed, is left-justified while the number is right-justified). |
Width, fill, and precision
The internal variables that control the width of the output field, the fill character used to pad an output field, and the precision for printing floating-point numbers are read and written by member functions of the same name.
Function | effect |
---|---|
int ios::width( ) | Returns the current width. (Default is 0.) Used for both insertion and extraction. |
int ios::width(int n) | Sets the width, returns the previous width. |
int ios::fill( ) | Returns the current fill character. (Default is space.) |
int ios::fill(int n) | Sets the fill character, returns the previous fill character. |
int ios::precision( ) | Returns current floating-point precision. (Default is 6.) |
int ios::precision(int n) | Sets floating-point precision, returns previous precision. See ios::floatfield table for the meaning of "precision." |
The fill and precision values are fairly straightforward, but width requires some explanation. When the width is zero, inserting a value produces the minimum number of characters necessary to represent that value. A positive width means that inserting a value will produce at least as many characters as the width; if the value has fewer than width characters, the fill character is used to pad the field. However, the value will never be truncated, so if you try to print 123 with a width of two, you’ll still get 123. The field width specifies a minimum number of characters; there’s no way to specify a maximum number.
The width is also distinctly different because it’s reset to zero by each inserter or extractor that could be influenced by its value. It’s really not a state variable, but rather an implicit argument to the inserters and extractors. If you want a constant width, call width( ) after each insertion or extraction.
An exhaustive example
To make sure you know how to call all the functions previously discussed, here’s an example that calls them alclass="underline" .
//: C04:Format.cpp
// Formatting Functions
#include <fstream>
#include <iostream>
#include "../require.h"
using namespace std;
#define D(A) T << #A << endl; A
int main() {
ofstream T("format.out");
assure(T);
D(int i = 47;)
D(float f = 2300114.414159;)
const char* s = "Is there any more?";
D(T.setf(ios::unitbuf);)
D(T.setf(ios::showbase);)
D(T.setf(ios::uppercase | ios::showpos);)
D(T << i << endl;) // Default is dec
D(T.setf(ios::hex, ios::basefield);)
D(T << i << endl;)
D(T.setf(ios::oct, ios::basefield);)
D(T << i << endl;)
D(T.unsetf(ios::showbase);)
D(T.setf(ios::dec, ios::basefield);)
D(T.setf(ios::left, ios::adjustfield);)
D(T.fill('0');)
D(T << "fill char: " << T.fill() << endl;)
D(T.width(10);)
T << i << endl;
D(T.setf(ios::right, ios::adjustfield);)
D(T.width(10);)
T << i << endl;
D(T.setf(ios::internal, ios::adjustfield);)
D(T.width(10);)
T << i << endl;
D(T << i << endl;) // Without width(10)
D(T.unsetf(ios::showpos);)
D(T.setf(ios::showpoint);)
D(T << "prec = " << T.precision() << endl;)
D(T.setf(ios::scientific, ios::floatfield);)
D(T << endl << f << endl;)
D(T.unsetf(ios::uppercase);)
D(T << endl << f << endl;)
D(T.setf(ios::fixed, ios::floatfield);)
D(T << f << endl;)
D(T.precision(20);)
D(T << "prec = " << T.precision() << endl;)
D(T << endl << f << endl;)
D(T.setf(ios::scientific, ios::floatfield);)
D(T << endl << f << endl;)
D(T.setf(ios::fixed, ios::floatfield);)
D(T << f << endl;)
D(T.width(10);)
T << s << endl;
D(T.width(40);)
T << s << endl;
D(T.setf(ios::left, ios::adjustfield);)