287 стр. Глава 24
. Использование потоков ввода-вывода
В этом примере с помощью функции precision( )
вывод значения dollarAmount устанавливается с точностью двух знаков после запятой. Благодаря этому вы можете увидеть на экране число 249.60 — именно то, что требовалось. Затем устанавливается вывод процентов с точностью четырёх знаков после запятой.Второй путь связан с использованием так называемых манипуляторов. ( Звучит страшновато, не так ли? ) Манипуляторы — это объекты, определённые в заголовочном файле iomanip.h
, которые приводят к тому же эффекту, что и описанные выше функции-члены ( чтобы иметь возможность пользоваться манипуляторами, вы должны не забыть включить iomanip.h в программу ). Единственное преимущество манипуляторов в том, что программа может включать их прямо в поток, не прибегая к вызову отдельной функции.Если вы перепишете предыдущий пример так, чтобы в нём использовались манипуляторы, программа будет иметь следующий вид:
#include
#include
void fn( float interest , float dollarAmount )
{
cout << "Сумма в долларах = " ;
<< setprecision( 2 )
<< dollarAmount << setprecision( 4 )
<< interest << "\n" ;
}
Наиболее распространённые манипуляторы и их назначение приведены в табл. 24.4.
Таблица 24.4. Основные манипуляторы и функции управления форматом потока
_________________
Манипулятор — Функция-член — Описание
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
dec — flags( 10 )
— Перейти в десятичную систему счисления hex — flags( 16 )
— Перейти в шестнадцатеричную систему счисления oct — flags( 8 )
— Перейти в восьмеричную систему счисления setfill( с ) — fill( c )
Установить символ заполнения с setprecision( с ) — precision( с )
— Установить количество отображаемых знаков после запятой в с setw( n ) — width( n )
— Установить ширину поля равной n символов* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
_________________
*Примечание: это значение воздействует на вывод одного поля, после чего происходит возврат к значению по умолчанию.
«Внимательно следите за параметром ширины поля ( функция
width( n ) либо манипулятор setw( n ) ). Большинство параметров сохраняют своё значение до тех пор, пока оно не будет изменено новым вызовом, однако для параметра ширины поля это не так. Этот параметр возвращается к значению по умолчанию, как только будет выполнен следующий вывод в поток. Например, приведённый ниже фрагмент кода не выведет два целочисленных значения длиной в 8 символов.» [
Атас!]_________________
288 стр. Часть 5
. Полезные особенности
#include
#include
void fn( )
{
cout << setw( 8 )
/* ширина поля равна 8... */ << 10 /* ...для 10 , но... */
<< 20 /* для 20 равна значению по умолчанию */
<< "\n" ;
}
В результате выполнения этого кода сначала будет выведено восьмисимвольное целое число, а за ним — двухсимвольное. Для вывода двух восьмисимвольных значений нужно сделать так:
#include
#include
void fn( )
{
cout << setw( 8 )
/* установить ширину... */ << 10
<< setw( 8 )
<< 20 /* ...обновить её */
<< "\n" ;
}
Таким образом, если вам нужно вывести несколько значений, но вас не устраивает длина поля по умолчанию, для каждого значения необходимо включать в вывод манипулятор setw( )
.Какой же метод лучше — с использованием манипуляторов или функций? Функции-члены предоставляют больше контроля над свойствами потока — хотя бы потому, что их больше. Кроме того, функции-члены обязательно возвращают предыдущее значение изменяемого параметра, так что у вас всегда есть возможность восстановить прежнее значение параметра. И наконец, существуют версии этих функций, позволяющие узнать текущее значение параметра, не изменяя его. Использование этой возможности показано в приведённом ниже примере.