Выбрать главу

    Arthur, 34567 67.50

    Имя = Arthur,Счёт = 34567, Баланс = 67.5

    Arthur, 67.5 34567

    ================

    Trudie, 56x78 78.90

    Ошибка разбора строки

    ================

    Valerie, 78901 89.10

    Имя = Valerie,Счёт = 78901, Баланс = 89.1

    Valerie, 89.1 78901

    ===============

    Press any key to continue...

Обратите внимание, как программа способна восстановиться после ошибок во входном файле. Оцените также простоту функции parseString( ), использующей возможности класса istringstream.

►Работа с манипуляторами...287

Обычно потоки ввода-вывода для выведения чисел и символов используют формат по умолчанию, который оказывается вполне подходящим для решения большинства задач.

Например, мне совсем не нравится, когда общая сумма в моей любимой финансовой программе выводится как 249.600006 вместо ожидаемого 249.6 ( а ещё лучше — 249.60 ). Необходимо каким-то образом указать программе количество выводимых цифр после десятичной точки. И такой способ есть; более того, в С++ он не единственный.

«В зависимости от установок по умолчанию вашего компилятора, вы можете увидеть на экране 249.6. Однако хотелось бы добиться того, чтобы выводилось именно 249.60.»

[Атас!]

Во-первых, форматом можно управлять с помощью серии функций-членов объекта потока. Например, количество разрядов для отображения можно установить, используя функцию precision( ):

    #include <iostream>

    void fn( float interest , float dollarAmount )

    {

        cout << "Сумма в долларах = " ;

        cout.precision( 2 ) ;

        cout << dollarAmount ;

        cout.precision( 4 ) ;

        cout << interest

             << "\n" ;

    }

_________________ 

287 стр. Глава 24. Использование потоков ввода-вывода

В этом примере с помощью функции precision( ) вывод значения dollarAmount устанавливается с точностью двух знаков после запятой. Благодаря этому вы можете увидеть на экране число 249.60 — именно то, что требовалось. Затем устанавливается вывод процентов с точностью четырёх знаков после запятой.

Второй путь связан с использованием так называемых манипуляторов. ( Звучит страшновато, не так ли? ) Манипуляторы — это объекты, определённые в заголовочном файле iomanip.h, которые приводят к тому же эффекту, что и описанные выше функции-члены ( чтобы иметь возможность пользоваться манипуляторами, вы должны не забыть включить iomanip.h в программу ). Единственное преимущество манипуляторов в том, что программа может включать их прямо в поток, не прибегая к вызову отдельной функции.

Если вы перепишете предыдущий пример так, чтобы в нём использовались манипуляторы, программа будет иметь следующий вид:

    #include <iostream>

    #include <iomanip>

    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 символов*

     ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯