The stream class hierarchy is quite large. For practical purposes, there are four useful kinds of
stream:
ifstream: input file stream
ofstream: output file stream
istringstream: input string stream
ostringstream: output string stream
We will discuss string streams later. For each of these kinds of stream, there is another with “w” in
front (for example, wifstream). These are streams of “wide” (16–bit or Unicode) characters.
File streams are opened by providing a file or path name. The name can be passed to the constructor
or to the open method. When a file is no longer needed, the close method should be called to
close it.
The extract operator >> reads date from an input file. The insert operator << writes data to an
output file. The right operand of an extractor must be a Lvalue. The right operand of an inserter is
an Rvalue.
The right operand of an extractor or inserter may also be a manipulator. Manipulators may extract
or insert data, but they are usually used to control the state of the stream. We have already seen
endl, which writes a new line and then flushes the buffer of an output stream.
Although endl is defined in iostream, most other manipulators are not. They are defined in
iomanip and so we have to write #include <iomanip> in order to use them. Here is a
selection of commonly used manipulators for output streams:
left: Start left-justifying output data (appropriate for strings)
right: Start right-justifying output data (appropriate for numbers)
setprecision(n): Put n digits after the decimal point for float and double data
setw(n): Write the next field using at least n character positions
fixed: Use fixed-point format for float and double data (for example, 3.1415926535)
scientific: Use “scientific” format for float and double data (for example, 1.3e12)
For example, the program shown is Figure 25 displays:
Alice 41 1169699.780
Boris 6500 3014133.560
Ching 1478 7915503.960
Daoust 4464 1605672.250
Boris 6500 3014133.560
Ching 1478 7915503.960
Daoust 4464 1605672.250