ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 12) онлайн

Класс ios

Ios является дедушкой всех потоковых классов и обладает большинством осо-

бенностей, без которых работа с потоками была бы невозможна. Три его главных

направления — это флаги форматирования, флаги ошибок и режим работы с фай-

лами. Сначала мы обратимся к рассмотрению флагов форматирования, затем

флагов состояния ошибки. Рассмотрение режима работы с файлами мы отложим

до тех пор, пока не познакомимся с дисковыми файлами.

Флаги форматирования

Флаги форматирования — это набор определений enum (перечисляемого типа)

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

маты и способы ввода/вывода. Мы не будем обсуждать подробно каждый флаг,

так как одни мы уже использовали, а названия других говорят сами за себя. Не-

которые мы обсудим позднее в этой же главе. В табл. 12.1 приводится полный

список флагов форматирования.

Таблица 12.1. Флаги форматирования класса ios

 

Флаг      Значение

skipws  Пропуск пробелов при вводе

left         Выравнивание по левому краю

right      Выравнивание по правому краю

internal                Заполнение между знаком или основанием числа и самим числом

dec        Перевод в десятичную форму

oct         Перевод в восьмеричную форму

hex        Перевод в шестнадцатеричную форму

boolalpha           Перевод логического 0 и 1 соответственно в «false» и «true»

showbase

                Выводить индикатор основания системы счисления (0 для восьмеричной, Ох  для шестнадцатеричной)

showpoint          Показывать десятичную точку при выводе

uppercase          Переводить в верхний регистр буквы X, Е и буквы шестнадцатеричной  системы счисления (ABCDEF) (по умолчанию — в нижнем регистре)

showpos             Показывать «+» перед положительными целыми числами

scientific              Экспоненциальный вывод чисел с плавающей запятой

fixed     Фиксированный вывод чисел с плавающей запятой

unitbuf Сброс потоков после вставки

stdio      сброс stdout, sterror после вставки

 

Есть несколько способов установки флагов форматирования, для каждого

свои. Так как они являются компонентами класса ios, обычно к ним обращаются

посредством написания имени класса и оператора явного задания (например,

ios::skipws). Все без исключения флаги могут быть выставлены с помощью мето-

дов setf() и unsetf(). Взгляните на следующий пример:

cout.setf(ios::left); //выравнивание текста по левому краю

cout << "Этот текст выровнен по левому краю"

cout.unsetf(ios::left); //вернуться к прежнему форматированию

Многие флаги могут быть установлены с помощью манипуляторов, давайте

рассмотрим их.

Манипуляторы

Манипуляторы — это инструкции форматирования, которые вставляются прямо

в поток. Мы уже видели некоторые из них, например endl, который посылает

символ разделителя строк в поток и сбрасывает буфер:

cout << "Jedem Das Seine." << endl;

Мы встречали в программе SALEMON, глава 7 «Массивы и строки», манипуля-

тор setiosflags(). Вспомним, как он выглядит:

cout << setiosflags(ios::fixed) //использовать

                                //фиксированный вывод

<< setiosflags(ios::showpoint)  //показывать десятичную

                                //точку

<< var;

Как показывают эти примеры, манипуляторы бывают двух видов — с аргу-

ментами и без. В табл. 12.2 сведены вместе все важные манипуляторы без аргу-

ментов.

Таблица 12.2. Манипуляторы ios без аргументов

Манипулятор  Назначение

ws          Включает пропуск пробелов при вводе

dec        Перевод в десятичную форму

oct         Перевод в восьмеричную форму

hex        Перевод в шестнадцатеричную форму

endl       Вставка разделителя строк и очистка выходного потока

ends      Вставка символа отсутствия информации для окончания выходной строки

flush      Очистка выходного потока

lock        Закрыть дескриптор файла

unlock  Открыть дескриптор файла

Вставляются эти манипуляторы прямо в поток. Например, чтобы вывести var

в шестнадцатеричной форме, надо указать:

cout << hex << var;

 

Имейте в виду, что манипуляторы действуют только на те данные, которые

следуют за ними в потоке, а не на те, которые находятся перед ними. На то он и

поток. В табл. 12.3 представлены важнейшие из манипуляторов с аргументами.

Для доступа к этим функциям вам потребуется заголовочный файл IOMANIP.

Таблица 12.3. Манипуляторы ios с аргументами

Манипулятор  Аргумент           Назначение

setw()  ширина поля (int)         Устанавливает ширину поля для

вывода данных

Setfill() символ заполнения (int)           Устанавливает символ заполнения

(по умолчанию, пробел)

setprecision()   точность (int)   Устанавливает точность(число

выводимых знаков)

setiosflags()       Флаги форматирования (long)               Устанавливает указанные флаги

форматирования

resetiosflags()  Флаги форматирования (long)               Сбрасывает указанные флаги

форматирования

Функции

Класс ios содержит набор функций, с помощью которых можно выставлять

флаги форматирования и выполнять некоторые другие действия. Таблица 12.4

содержит большинство этих функций, кроме тех, которые обрабатывают ошиб-

ки. К последним мы обратимся позднее.

Таблица 12.4. Функции ios

Функция             Назначение

ch=fill();               Возвращает символ заполнения (символ, которым заполняется

неиспользуемая часть текстового поля; по умолчанию — пробел)

fill(ch);  Устанавливает символ заполнения

p=precision();   Возвращает значение точности (число выводимых знаков для формата

с плавающей запятой)

precision(p);      Устанавливает точность р

w=width();         Возвращает текущее значение ширины поля (в символах)

width(w);           Устанавливает ширину текущего поля

setf(flags);         Устанавливает флаг форматирования (например, ios::left)

unsetf(flags);    Сбрасывает указанный флаг форматирования

setf(flags, field);              Очищает поле, затем устанавливает флаги форматирования

Эти функции вызываются для нужных потоковых объектов обычным спосо-

бом — через точку. Например, чтобы установить ширину поля 12, можно написать:

cout.width(14);

Следующее выражение делает символом заполнения звездочку (как при тес-

тировании печати):

cout.fill('*');

 

Можно использовать некоторые функции, чтобы манипулировать напрямую

установкой флагов форматирования. Например, так можно установить вырав-

нивание по левому краю:

 

cout.setf(ios:: left);

Чтобы восстановить выравнивание по правому краю, напишем:

cout.unsetf(ios::left);

Версия setf() с двумя аргументами использует второй из них для сбрасы-

вания всех флагов указанного типа (в поле). При этом установится флаг, ука-

занный в качестве первого аргумента. Таким образом, проще сбросить флаги

перед установкой нового. В табл. 12.5 показан способ обращения с этой функ-

цией.

Например,

cout.setf(ios::left, ios::adjustfield);

сбрасывает все флаги, связанные с выравниванием текста, а затем устанавливает

флаг left для выравнивания по левому краю.

Таблица 12.5. Версия setf() с двумя аргументами

Первый аргумент:  устанавливаемые флаги  Второй аргумент:  сбрасываемые флаги

dec, oct, hex     basefield

left, right, internal          adjustfield

scientific, fixed floatfield

С использованием указанной техники можно создать способ форматирован-

ного ввода/вывода не только с клавиатуры и на дисплей, но, как мы увидим

позднее В ЭТОЙ главе, также и для файлов.

 

6